내 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
도커 서비스를 다시 시작하여 문제를 해결했습니다.