복사 실패 : stat / var / lib / docker / tmp / docker-xxx : 해당 파일 또는 디렉토리 없음
도커 이미지를 빌드하는 github 작업 워크 플로가 있습니다.
name: Backend-Demo Docker Image CI
on:
push:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Login to Azure Container Registry
run: echo ${{ secrets.REGISTRY_PASSWORD }} | docker login ${{ secrets.LOGIN_SERVER_URL }} -u ${{ secrets.REGISTRY_USERNAME }} --password-stdin - name: Get the version id: vars run: echo ::set-output name=tag::$(echo ${GITHUB_REF:10})
- name: Build the tagged Docker image
run: docker build . --file backend/Dockerfile --tag backend-demo/spring-boot:v1.0
Dockerfile은 다음과 같습니다.
FROM openjdk:14-alpine
MAINTAINER example.com
RUN mkdir -p /opt/demo-0.0.1/lib
# Setting application source code working directory
WORKDIR /opt/demo-0.0.1/
COPY target/demo-0.0.1-SNAPSHOT.jar /opt/demo-0.0.1/lib/demo-0.0.1-SNAPSHOT.jar
# ADD target/demo-0.0.1-SNAPSHOT.jar /opt/demo-0.0.1/lib/
RUN sh -c 'touch demo-0.0.1-SNAPSHOT.jar'
ENTRYPOINT ["java"]
CMD ["-jar", "/opt/demo-0.0.1/lib/demo-0.0.1-SNAPSHOT.jar"]
하지만이 워크 플로를 실행할 때 COPY
지침 에서이 오류가 발생했습니다 .
Step 5/8 : COPY target/demo-0.0.1-SNAPSHOT.jar /opt/demo-0.0.1/lib/demo-0.0.1-SNAPSHOT.jar
COPY failed: stat /var/lib/docker/tmp/docker-builder851513197/target/demo-0.0.1-SNAPSHOT.jar: no such file or directory
##[error]Process completed with exit code 1.
나는 확인했고 우리가 Dockerfile
내 지시와 같은 다른 디렉토리에있는 파일을 가질 때 일반적인 오류처럼 보입니다 .
docker build . --file backend/Dockerfile --tag backend-demo/spring-boot:v1.0
또한 .dockerignore
파일 이 없으며 Dockerfile이 Dockerfile
정확하게 호출 됩니다.
target/demo-0.0.1-SNAPSHOT.jar
내가 사본에 노력하고 파일은 문맥에 일이있을 수 있지만, 아마도 무엇 확실하지 내 GitHub의 저장소에 존재하는 이 답변은 좋은 힌트가 될 수 있을까?
답변
당신이 달릴 때
docker build . --file backend/Dockerfile ...
경로 인수 .
는 컨텍스트 디렉토리가 됩니다. (Docker는 실제로 /var/lib/docker/tmp/...
경로의 출처 인이 디렉터리 트리의 복사본을 자신에게 보냅니다 .) COPY
및 ADD
명령어 의 소스 인수 는 Dockerfile이 아닌 컨텍스트 디렉터리를 기준으로합니다.
소스 트리가 다음과 같은 경우
.
+-- backend
| \-- Dockerfile
\-- target
\-- demo-0.0.1-SNAPSHOT.jar
표시하는 Dockerfile과 일치합니다. 하지만 대신에
.
+-- backend
+-- Dockerfile
\-- target
\-- demo-0.0.1-SNAPSHOT.jar
표시되는 오류가 발생합니다.
컨텍스트 디렉토리 외부를 참조 할 필요가없는 경우 전달하려는 디렉토리를 변경할 수 있습니다. docker build
COPY target/demo-0.0.1-SNAPSHOT.jar /opt/demo-0.0.1/lib/demo-0.0.1-SNAPSHOT.jar
docker build backend ...
또는 복사해야하는 다른 콘텐츠 COPY
가있는 경우 최상위 디렉터리에 상대적인 경로로 변경해야합니다 .
COPY backend/target/demo-0.0.1-SNAPSHOT.jar /opt/demo-0.0.1/lib/demo-0.0.1-SNAPSHOT.jar
COPY common/config/demo.yml /opt/demo-0.0.1/etc/demo.yml
docker build . -f backend/Dockerfile ...
WORKDIR은 다른 명령이 실행될 위치를 알려줍니다. 중요한 점은 WORKDIR이 local / git 디렉토리가 아닌 docker 디렉토리에서 작동한다는 것입니다. 예에 따라 WORDIR은 /opt/demo-0.0.1/에 컨텍스트를 사용하지 않습니다. ,하지만 docker 내부에 /opt/demo-0.0.1/ 로 빈 디렉토리를 만듭니다 . dockerfile이 작동하도록하려면 COPY 명령에서 COPY /opt/demo-0.0.1/target/demo-0.0.1-SNAPSHOT.jar /opt/demo-0.0.1/lib/demo- 와 같은 전체 경로를 제공해야합니다. 0.0.1-SNAPSHOT.jar . Dockerfile이 / opt 디렉터리와 동일한 수준인지 확인합니다.