도커 이미지를 빌드하기 위해 아래 명령어를 썼더니 계속 경로 문제로 에러가 발생했다.
jar파일 만들기
./gradlew build
명령어로 jar파일을 만들었을 때, ../build/libs에 0.0.1-SNAPSHOT.jar, 0.0.1-SNAPSHOT-plain.jar 파일이 생성된다. 이 중 전자를 docker build 하다가 발생한 문제다.
명령어 :
PS C:\Users\User\IdeaProjects\sns> docker build -t user_id/project_name:tag .
맨 뒤의 .을 ./으로도 바꿔보고, Docker file의 경로도 여러가지로 바꿨으나 에러 문구만 바뀔뿐 내용은 바뀌지 않았다.
Dockerfile :
FROM openjdk:11
EXPOSE ${SPRINGBOOT_PORT}
ADD build/libs/*.jar app.jar
ENTRYPOINT ["java", "-jar", "-Duser.timezone=Asia/Seoul", "/app.jar"]
도커파일도 마찬가지로 바꿔봤지만 계속 아래의 에러가 났다.
에러는 3번째 줄의 경로 없음 문제였고, build앞에 ./ , ../ 로 바꿔보고, jar파일명을 직접 적기도 해봤다.
=> ERROR [2/2] ADD build/libs/*.jar app.jar 0.1s
------
> [2/2] ADD build/libs/*.jar app.jar:
------
Dockerfile:3
--------------------
1 | FROM openjdk:11
2 | EXPOSE ${SPRINGBOOT_PORT}
3 | >>> ADD build/libs/*.jar app.jar
4 | ENTRYPOINT ["java", "-jar", "-Duser.timezone=Asia/Seoul", "/app.jar"]
--------------------
ERROR: failed to solve: lstat /var/lib/docker/tmp/buildkit-mount15
ERROR: failed to solve: lstat /var/lib/docker/tmp/buildkit-mount... no such file or directory
ERROR: failed to solve: failed to compute cache key: failed to calculate checksum of ref 503... no such file or directory
ERROR: failed to solve: /build/lib ... no such file or directory
Dockerfile을 DockerFile이나 dockerfile이라고 적는다면 Dockerfile을 찾지 못해 경로 에러가 발생할 수 있다고 한다.
해결 방법 => 철자를 바꾸면 된다.
=> 하지만, 내 경우는 .jar파일을 찾지 못하는 것이다.
바탕화면이나 환경 변수가 설정되어있는 위치에서 시작하는 경우 dockerfile과 jar이 있는 위치와 명시된 위치가 다르기 때문에 못찾을 수 있다.
해결 방법 => 프로젝트 위치에서 시작하면 된다.
=> 내 경우에 해당되지 않았다.
1. .dockerignore 확인
ignore파일에 jar파일과 build 디렉토리가 포함된 걸 지우니까 docker build가 되었다.
하지만 plain파일만 빌드되었다.
2. 파일명 내 . 삭제(.jar에만 . 사용)
결국 *.jar 대신에 직접 파일명을 명시해줬는데, "."이 포함되어서 그런지 계속 같은 경로에러가 났다.
build.gradle에서 jar파일을 0-SNAPSHOT.jar로 저장하도록 변경한 뒤, Dockerfile에 직접 0-SNAPSHOT.jar로 명시하였다.
그리고 드디어 성공했다...!!
다행이 jar파일이 많이 없어서 조건을 비교할 필요가 없었다.
(project_name)/ build / libs/ *.jar이면 ** / ** / *.jar인줄 알았다.
.dockerignore파일에서 "** / *.jar"을 *.jar로 변경한 뒤 성공했다는 게 의문이어서 찾아본 결과,
**가 계속 반복되는 디렉토리, 즉 0개 이상의 디렉토리 및 모든 하위 디렉토리를 의미하고
*는 단일 디렉토리나 파일 이름에서 0개 이상의 문자와 일치해야하는 것을 의미한다
고 한다.
파일이름에서 쓰는 와일드카드 *는 알고 있었는데, **가 하위 디렉토리를 계속 찾을 수 있다는 것은 새로 배우게 되었다.