Docker COPY 문제-“그러한 파일이나 디렉토리가 없습니다”


36

내 Dockerfile에는 다음과 같은 'COPY'문이 있습니다.

# Copy app code
COPY /srv/visitor /srv/visitor

내 호스트 시스템의 "/ srv / visitor"디렉토리에는 실제로 내 소스 코드가 있습니다.

[root@V12 visitor]# ls /srv/visitor/
Dockerfile  package.json  visitor.js

이제이 Dockerfile을 사용하여 이미지를 만들려고하면 "COPY"가 발생하는 단계에서 정지됩니다.

Step 10 : COPY /srv/visitor /srv/visitor
INFO[0155] srv/visitor: no such file or directory

그것은 그러한 디렉토리는 없지만 분명히 존재한다고 말합니다.

어떤 아이디어?

업데이트 1 :

빌드 컨텍스트를 이해하는 방식으로 내가 틀렸다는 것이 나에게 지적되었다. 제안은 "COPY"문을 다음과 같이 변경했습니다.

COPY . /srv/visitor

문제는 내가 이런 식으로했고 빌드 프로세스가 다음 단계에서 중단되었다는 것입니다.

RUN npm install

"no package.json file found"란에 명확하게 존재하는 내용이 있습니다.

업데이트 2 :

Dockerfile에서 다음과 같이 변경해 보았습니다.

COPY source /srv/visitor/

npm을 실행하려고 할 때 중지되었습니다.

Step 12 : RUN npm install
 ---> Running in ae5e2a993e11
npm ERR! install Couldn't read dependencies
npm ERR! Linux 3.18.5-1-ARCH
npm ERR! argv "/usr/bin/node" "/usr/sbin/npm" "install"
npm ERR! node v0.10.36
npm ERR! npm  v2.5.0
npm ERR! path /package.json
npm ERR! code ENOPACKAGEJSON
npm ERR! errno 34

npm ERR! package.json ENOENT, open '/package.json'
npm ERR! package.json This is most likely not a problem with npm itself.
npm ERR! package.json npm can't find a package.json file in your current directory.

npm ERR! Please include the following file with any support request:
npm ERR!     /npm-debug.log
INFO[0171] The command [/bin/sh -c npm install] returned a non-zero code: 34

복사가 수행 되었습니까? 그렇다면 npm에서 package.json을 찾을 수없는 이유는 무엇입니까?


2017 년에 문제를 찾는 사람들의 경우 github.com/docker/for-mac/issues/1922 문제 일 수 있습니다 . .dockerignore 파일을 삭제하고 다시 테스트하는 것이 좋습니다. 그래도 문제가 해결되지 않으면 .dockerignore의 설정을 사용하여 문제를 해결할 수 있습니다.
정의되지 않은

답변:


35

설명서에서 :

<src>경로는 빌드의 문맥 안에 있어야합니다 ; 도커 빌드의 첫 번째 단계는 컨텍스트 디렉토리 (및 서브 디렉토리)를 도커 디먼으로 보내는 것이므로 ../something / something을 복사 할 수 없습니다.

사용할 때 /srv/visitor실제로 현재 디렉토리 인 경우에도 빌드 컨텍스트 외부의 절대 경로를 사용합니다.

다음과 같이 빌드 컨텍스트를 더 잘 구성하십시오.

├── /srv/visitor
│   ├── Dockerfile
│   └── resources
│       ├── visitor.json
│       ├── visitor.js

그리고 사용 :

COPY resources /srv/visitor/

노트 :

docker build - < Dockerfile 컨텍스트가 없습니다.

따라서 사용

docker build .


이미 호스트 시스템의 "/ srv / visitor"디렉토리에 있으며 모든 소스 코드와 Dockerfile이 여기에 있습니다. 이 모든 소스가 컨테이너의 "/ srv / visitor"디렉토리에 복사되도록 "COPY"문을 어떻게 작성해야합니까?
dsljanus

1
@dsljanus 소스 디렉토리 또는 파일은 빌드 컨텍스트 즉 디렉토리와 관련 이 있어야합니다 /srv/visitor.
Xavier Lucas

"."여야합니까? 그렇게했고 다음 단계 인 "RUN npm install"에서 빌드 프로세스가 중지 되었기 때문입니다. "no package.json file found"줄에 무언가가 있습니다. 내 업데이트도 참조하십시오.
dsljanus

2
@dsljanus 그리고 어디서 npm을 실행하고 있습니까? 전체 dockerfile을 게시하십시오 ... Btw는 질문에서 이와 같은 여러 업데이트를 수정하지 않습니다. 한 문제에서 완전히 다른 문제로 건너 뛰는 것은 정말 성가신 일입니다. SF의 목적은 명확한 답변을 얻기 위해 명확한 질문을 게시하는 것입니다.
Xavier Lucas

1
@dsljanus 문제가 되었으므로 사용하지 말고 RUN cd사용하십시오. WORKDIR그래서 현재 디렉토리는 각 단계 사이에 기억됩니다. 도커 파일은 도커 실행 + 도커 커밋을위한 래퍼에 지나지 않으므로 각 단계는 이전 계층에서 독립적으로 실행됩니다. 이는 /이 지시문을 사용하지 않으면 각 단계에서 pwd가 동일 함을 의미 합니다.
Xavier Lucas

39

나에게 디렉토리는 올바른 컨텍스트에 있었고 .dockerignore프로젝트 루트의 (숨겨진) 파일 에만 포함되었습니다 . 오류 메시지가 나타납니다.

lstat mydir/myfile.ext: no such file or directory

3
당신은 의미 .dockerignore? 방금 나에게 일어난 일
Martín Coll

5
축복합니다! 내가 잊어 버린 전체 디렉토리가 있었으므로 빌드가 손상되었습니다. 작은 참고로, 당신이있는 디렉토리에서 하나의 파일을 해제 무시할 수 있습니다 !path/to/my/file경우에도 path입니다 .dockerignore.
hjc1710

이것은 좋은 것입니다.
Gudlaugur Egilsson

지난 하루 동안 자신을 고문하고, 이것에 대해 당신에게 얼마나 감사하는지 표현할 수 없습니다. 도 커용 VS 도구에 *가 포함 된 .dockerignore가 포함 된 이유를 여전히 알 수 없음
bilal.haider

7

나에게 문제는 내가 사용하고 있다는 것이었다. docker build - < Dockerfile

로부터 문서 참고 : STDIN을 (사용하여 구축 할 경우 docker build - < somefile) COPY를 사용할 수없는, 그래서, 어떤 빌드 컨텍스트가 없습니다.


1

Xavier Lucas [매우 유용한] 답변에서 언급했듯이 빌드 컨텍스트 외부의 디렉토리에서 COPY 또는 ADD를 사용할 수 없습니다 ( "docker build"를 실행하는 폴더는 .Dockerfile과 동일한 디렉토리 여야 함). 심볼릭 링크를 사용하려고해도 작동하지 않습니다.

참고 : 이것은 POSIX (Linux, Unix, Mac, Windows 용 Linux 하위 시스템)에만 해당됩니다. JUNCTION을 사용하여 Windows에서 유사한 작업을 수행 할 수 있습니다.

cd ~/your_docker_project/
cp -al /subfolder/src_directory ./
echo "COPY src_directory /subfolder/" >> Dockerfile

위험 : 이것을 사용하면 docker 프로젝트가 호스트에 따라 다릅니다. 당신은 거의 이것을하고 싶지 않습니다! 조심히 다루세요.

응용 : 개발 환경에서의 학습, 실험

이것은 나를 위해 속임수를했다. cp -al은 디렉토리 구조를 복사하고 모든 파일에 대한 하드 링크를 만듭니다. 완료되면 "rm -rf ./src_directory"를 실행하여 제거하십시오.


내 목적 : 로컬 파일 시스템의 캐시 된 패키지를 내 docker 이미지로 복사합니다. 필요한 도구를 설치하십시오 (캐시를 사용하거나 새로 다운로드하십시오). 그런 다음 이미지에서 해당 캐시를 삭제하고 호스트에서 하드 링크를 삭제합니다. 호스트에 해당 파일이 없으면 걱정할 필요가 없습니다. 그러나 대역폭과 드라이브 공간이 제한적입니다. 이 사용이 허용됩니까?
TamusJRoyce

1

이 문제가 발생하여 다른 디렉토리에서 Dockerfile을로드하기 위해 빌드 변수에 컨텍스트를 추가 할 수 있음을 알았습니다. 이것은 기본 Docker 파일 구조를 원하는대로 조금 더 변경할 수있게했습니다. 다음은 docker-compose.yml의 스 니펫입니다.

version: '3'
services:
  webserver:
    build:
      context: .
      dockerfile: ./server/Dockerfile
    ...

컨텍스트를 추가하여 파일을 참조 할 위치를 정의 할 수있었습니다. 여기에서 Docker 문서를 참조 할 수 있습니다 : https://docs.docker.com/compose/compose-file/#context

도움이 되었기를 바랍니다!


0

나에게 문제는 내가 추가 한 파일 이름 뒤에 공백이 있다는 것입니다. 이름 변경으로 해결되었습니다.


0

다음 오류의 경우

COPY failed: stat

도커 서비스를 다시 시작하여 문제를 해결했습니다.


0

필자의 경우이 문제를 마침내 해결했습니다. 복사를 실행하는 Dockerfile은 프로젝트의 더 깊은 수준에있었습니다. 그래서 호스트의 빌드 경로는 Dockerfile의 파일 위치를 기준으로 표현된다는 것을 깨달았습니다.


0

다른 디렉토리에서 docker 파일을 실행하려고 할 때 이런 일이 발생했습니다.

나는 COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directorydocker 파일을 지정하여 이것을 해결하고 관리했습니다.

달리는 docker build . -f docker/development/Dockerfile일했다.

그러나 Runningdocker build docker / development / Dockerfile`을 실행 하면이 문제가 발생했습니다.

-f또는 --file의 이름과 위치를 지정합니다 Dockerfile.

Dockerfile앱 루트 디렉토리에있을 때 제대로 작동 했기 때문에 처음에는 이상 하다고 생각했습니다. 환경 도커 파일을 조금 더 관리하려는 경우 도움이됩니다.


0

파일은 현재 빌드 컨텍스트의 디렉토리에 있어야 할뿐만 아니라 빌드 컨텍스트 외부의 파일에 대한 소프트 링크 일 수도 없습니다.

내 홈 디렉토리에 파일에 대한 링크가 있고 링크가 프로젝트 디렉토리에있었습니다. 링크를 삭제하고 링크 된 파일을 프로젝트 ( rm mylink ; mv ~/myrealfile ./)로 옮긴 후에 작동했습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.