복사 실패 : stat / var / lib / docker / tmp / docker-xxx : 해당 파일 또는 디렉토리 없음

Aug 18 2020

도커 이미지를 빌드하는 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의 저장소에 존재하는 이 답변은 좋은 힌트가 될 수 있을까?

답변

4 DavidMaze Aug 18 2020 at 07:46

당신이 달릴 때

docker build . --file backend/Dockerfile ...

경로 인수 .컨텍스트 디렉토리가 됩니다. (Docker는 실제로 /var/lib/docker/tmp/...경로의 출처 인이 디렉터리 트리의 복사본을 자신에게 보냅니다 .) COPYADD명령어 의 소스 인수 는 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 ...
1 serialkiller Aug 18 2020 at 00:58

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 디렉터리와 동일한 수준인지 확인합니다.