Docker COPY 문제-“그러한 파일이나 디렉토리가 없습니다” 말합니다. 어떤 아이디어? 업데이트 1 : 빌드 컨텍스트를

내 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을 찾을 수없는 이유는 무엇입니까?



답변

설명서에서 :

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

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

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

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

그리고 사용 :

COPY resources /srv/visitor/

노트 :

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

따라서 사용

docker build .


답변

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

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

답변

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

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


답변

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”를 실행하여 제거하십시오.


답변

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

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

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

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


답변

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


답변

다음 오류의 경우

COPY failed: stat

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