Dockerfile의 파일을 복사하는 중, 그러한 파일이나 디렉토리가 없습니까?


93

루트 (~) 폴더에 Dockerfile이 설정되어 있습니다. 내 파일의 처음 세 줄은 다음과 같습니다.

COPY file1 /root/folder/
COPY file2 /root/folder/
COPY file3 /root/folder/

그러나 각 줄에 대해 다음 오류를 반환합니다.

그러한 파일 또는 디렉토리 없음

파일은 내 Dockerfile과 docker build - < Dockerfile동일한 디렉토리에 있으며 터미널의 동일한 디렉토리에서도 명령 을 실행하고 있습니다.

내가 여기서 정확히 뭘 잘못하고 있니?


이 문제가 발생하여 .dockerignore 파일이 복사하려는 파일을 무시하고 있음을 알았습니다. jinschubert의 솔루션 : github.com/docker/for-mac/issues/1922
JStrahl

답변:


35

의 COPY 명령 Dockerfile에있는 파일을 복사 src받는 dest폴더. 당신 같은 외모 중 하나를 누락 file1, file2file3또는 구축을 위해 노력 Dockerfile잘못된 폴더에서.

Dockerfile 문서 참조

또한를 빌드하는 명령은 Dockerfile다음과 같아야합니다.

cd into/the/folder/
docker build -t sometagname .

3
두 번째 명령은 실패한다고 "빌드"에는 하나의 인수가 필요하다고 말합니다.
GreenGodot

오-지금 cmd를 업데이트하십시오. Dockerfile을 언급 할 필요가 없습니다.
askb

3
링크를 제대로 읽은 후 DockerFile이 루트 폴더에 전혀 없어야한다는 것을 알았습니다. 모든 것을 하위 디렉토리로 이동하고 빌드 명령을 실행하면 실행됩니다. 귀하의 답변이 가장 도움이되었으므로 정답으로 표시하겠습니다.
GreenGodot

47
또한 Docker Ignore 파일이 있는지 (아님) 확인하십시오.
Tony

248

.dockerignore파일도 확인하십시오 .

이것은 매우 드문 경우라는 것을 알고 있지만 그 파일을 거기에 언급했습니다.


3
오 마이 갓 감사합니다. 나는 Java 프로젝트의 이름을 변경하고 있었으며 (따라서 artifact 및 build dir) ripgrepdotfile에서 검색하지 않으므로 이전 디렉토리에 대한 마지막 성가신 참조를 보지 못했습니다.
Martin Lehmann

4
headsup 주셔서 감사합니다, 내 경우에는 내가 고정 표시기를위한 비주얼 스튜디오의 마법사를 사용했다 그리고 그것은 :( 첫 번째 줄에 *와 .dockerignore 추가
lacripta

어떤 이유로 내 기본 .dockerignore에는 ** \ bin이 있습니다. Docker 데스크톱에서 생성되었다고 확신합니다.
스티브 스미스

ahhghgghghg는 결국 그렇게 드문 경우가 아닌 것 같습니다 !!!. 백만년 안에 그것을 알아 내지 못했을 것입니다. 잠시 전에 디렉토리를 추가하고 완전히 잊었습니다. 가 매우 느린 어떤 빌드를하게되고이를 추가하는 이유는 ...이 자식과 함께 할 것 같아요
tahiche

1
오 진지하게, 그게 무슨 오류 야. 지적 해주셔서 감사합니다!
taiBsu

36

이는 file1 / file2 / file3을 빌드 컨텍스트에없는 절대 경로로 참조하고 있기 때문일 수 있습니다. Docker는 빌드 컨텍스트에서만 경로를 검색합니다.

예를 들어 COPY / home / yourname / file1을 사용하는 경우 Docker 빌드는 $ {docker build working directory} / home / yourname / file1로 해석합니다. 여기에 동일한 이름의 파일이 없으면 파일 또는 디렉터리 오류가 발생하지 않습니다.

Docker 문제 중 하나를 참조하십시오.


어떤 종류의 절대 경로 문제가 있습니다. "COPY relative / path / x." 나는 "COPY / absolute / path / y."할 수 없습니다. 아무도 그 이유를 압니까?
Alexander Mills

8
@AlexanderMills Dockerfiles는 호스트 시스템에서 독립적으로 실행 가능해야하며 Dockerfile과 관련된 경로에서 사용 가능한 추가 파일과 함께 제공됩니다. 절대 경로를 사용하면 컴퓨터에서만 실행할 수 있습니다.
kciesielski

그것은 ADD지시 에 대한 나의 문제 이기도했습니다. 감사합니다.
vmonteco

나는 이것을 몰랐다. 파일이 dockerfile과 함께 포함되도록 변경하면 실제로 완벽하게 작동했습니다. 다른 소스 위치 (예 : / dir / dir2 / file과 같은 전체 경로)에서 가져 왔을 때 작동하지 않았습니다. 그것은 dockerfile로 일부 디렉토리에의하거나 자녀의 경우 작동
Newteq 개발자

21

명령은 다음과 같습니다.

docker build -t imagename .

과:

docker build -t imagename - < Dockerfile2

같은 방식으로 실행되지 않습니다. Dockerfile 및 Dockerfile2를 사용하여 한 폴더 내에서 2 개의 docker 이미지를 빌드하려는 경우 stdin (<Dockerfile2)을 사용하는 두 번째 예제에서 COPY 명령을 사용할 수 없습니다. 대신 다음을 사용해야합니다.

docker build -t imagename -f Dockerfile2 .

그러면 COPY가 예상대로 작동합니다.


16

달리는 docker build . -f docker/development/Dockerfile working, 애플리케이션의 루트가 아닌 지정된 디렉토리에서 도커 파일을 실행할 수 있습니다.

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

이것은 다른 디렉토리에서 도커 파일을 실행하려고 할 때 나에게 발생했습니다.

나는이 있었다 COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directory과 고정 표시기 파일을 지정하여이 문제를 해결할 수 있었다.

그것은 docker build docker/development/Dockerfile나를 위해이 문제를 일으켰습니다.

처음 Dockerfile에는 앱 루트 디렉토리에 가 있었을 때 제대로 작동 했기 때문에 이상하다는 것을 알았습니다 . 환경 도커 파일을 좀 더 잘 관리하려는 경우 도움이됩니다.


1
docker build . -f docker/development/Dockerfile이 작품
Pradeep Surale

1
대단히 감사합니다. 이것은 저에게도 효과적이었습니다. 그것은 나를 미치게 만들었다.
x0n

4

나는 방금이 문제를 경험했으며 여기에 제안 된 제안으로 문제가 해결되지 않았습니다. 알고 보니 내가 잘못 라인 엔딩했다 내 파일을 적절한 선 엔딩으로 변경했다. (이 경우 CRLF에서 LF로, 그래서 Ubuntu 14.04는 내가 Windows에서 편집했던 스크립트를 인식 할 것입니다.)

VSCode를 사용하여 줄 끝을 변경했으며 대부분의 코드 편집기에는 줄 끝을 선택할 수있는 옵션이 있습니다.

이것이 누군가를 돕기를 바랍니다.


예, 도움 : 한
로버트 스미스

3

약간 어리석은 느낌이 들지만 내 문제는 내가 docker-compose를 실행하고 있고 Dockerfile이 ./deploy 하위 디렉토리에 있다는 것입니다. 내 ADD 참조는 Dockerfile이 아닌 프로젝트의 루트에 상대적이어야합니다.

변경 : ADD ./file.tar.gz / etc / folder / to : ADD ./deploy/file.tar.gz / etc / folder /

어쨌든 누군가 같은 문제가 발생하면 게시 할 것이라고 생각했습니다.


3

다음은 솔루션과 모범 사례입니다.

복사하려는 모든 파일을 보관할 수있는 리소스 폴더를 만들어야합니다.

├── Dockerfile
│   └── resources
│       ├── file1.txt
│       ├── file2.js

파일 복사 명령은 다음과 같이 지정해야합니다.

COPY resources /root/folder/

어디

* resources -Dockerfile이있는 동일한 폴더에 생성 한 로컬 폴더

* / root / folder / -컨테이너의 폴더


1

다음 오류의 경우

COPY failed: stat /<**path**> :no such file or directory

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

sudo service docker restart

1

Docker put_archive에서 파일을 찾을 수 없음 오류. Docker에 Python API를 사용하고 있습니다. Docker 버전 1.12.5, 빌드 7392c3b

docker.errors.NotFound: 404 Client Error: Not Found ("lstat /var/lib/docker/aufs/mnt/39d58e00519ba4171815ee4444f3c43d2c6a7e285102747398f6788e39ee0e87/var/lib/neo4j/certificates: no such file or directory")

생성 된 도커 컨테이너에 파일을 복사 할 수 없습니다.

con = cli.create_container(...)
cli.put_archive(...)
cli.start(con['Id'])

작업 순서를 변경하면 오류가 없으며 파일이 원하는대로 정확하게 복사됩니다. 그래서 나는 내 코드가 작동하고 내가 원하는 것을하고 있다는 것을 압니다. 그러나 시작하기 전에 구성 파일을 컨테이너에 복사하는 것이 중요합니다. 시작 후 파일을 복사하면 컨테이너가 시작되기 전에 복사해야하는 사용자 지정 구성이 아닌 기본 구성으로 시작하도록 컨테이너가 큐에 추가됩니다. Docker는이 문제가 종결되었다고 주장하지만 여전히 내 애플리케이션에 영향을 미치고 있습니다.

이것은 작동합니다. 동일한 코드 실행 순서가 다릅니다.

con = cli.create_container(...)
cli.start(con['Id'])
cli.put_archive(...)

1

옳은 일을했다고 확신하지만도 커가 여전히 불평한다면이 문제를 살펴보세요 : https://github.com/moby/moby/issues/27134 .
나는 이것에 타서 도커 엔진 service docker restart을 다시 시작 하면이 문제가 해결되는 것 같습니다 .


1

나는 이것에 대한 수정을 찾고 있었고 내가 ADD 또는 COPY'ing 폴더가 빌드 폴더, 위의 여러 디렉토리 또는 /에서 참조 된 폴더에 없었습니다.

빌드 폴더 외부에서 빌드 폴더로 폴더를 이동하면 문제가 해결되었습니다.


1

stdin을 사용하지 않고 컨텍스트를 유지하는 방법 중 하나는 다음과 같습니다.

1) Dockerfile에 다음을 추가해야합니다.

ADD /your_dir_to_copy /location_in_container

2) 이후에 / your_dir_to_copy dir의 부모로 이동해야합니다.

2) 그런 다음이 명령을 실행하십시오.

sudo docker build . -t (image/name) -f path_of_your_dockerfile/Dockerfile

3) 컨테이너를 만든 후

docker run -ti --rm cordova bash

4) 컨테이너에 디렉토리를 복사 한 후


1

COPY에 대한 이전 호출로 인해 디렉토리가 변경 될 수 있습니다.

COPY ./server/package.json ./server      # this passes, but the dest ./server is considered a file

COPY ./server/dist ./server/dist         # error, ./server/dist is not a directory

첫 번째 호출에 후행 슬래시 추가

COPY ./server/package.json ./server/

1

나는 이것을 만났다. 일부 디렉토리 복사가 작동하지 않았습니다. 파일 복사가 완료되었습니다. .gitignore (단지 .dockerignore가 아닌)에 포함 된 파일도 무시되기 때문인 것으로 밝혀졌습니다. 참조 : https://github.com/zeit/now/issues/790


복사에 실패한 COPY에 대한 수십 개의 참조-이것은 .dockerignore범인 으로 참조 할 몇 안되는 항목 중 하나입니다.
Alvin

1

나는 이것이 오래되었다는 것을 알고 있지만 지적 할 것이 있습니다. 모든 것이 정상이라고 생각되면 .gitignore 파일을 확인하십시오. :)

폴더가 로컬에있을 수 있지만 폴더가 git에 있으면 해당 폴더가 서버에 없습니다. 즉, Docker가 해당 폴더가 존재하지 않기 때문에 찾을 수 없습니다.


1

유사하고 tslegaitis 의 답변 덕분에

gcloud builds submit --config cloudbuild.yaml . 

이것은 보여준다

Check the gcloud log [/home/USER/.config/gcloud/logs/2020.05.24/21.12.04.NUMBERS.log] to see which files and the contents of the
default gcloudignore file used (see `$ gcloud topic gcloudignore` to learn
more).

해당 로그를 확인하면 docker가 다음을 사용할 것이라고 말합니다 .gitignore.

DATE Using default gcloudignore file:
# This file specifies files that are *not* uploaded to Google Cloud Platform
# using gcloud. It follows the same syntax as .gitignore, with the addition of
# "#!include" directives (which insert the entries of the given .gitignore-style
# file at that point).
# ...

.gitignore

그래서 내 .gitignore(대신 화이트리스트로 사용) 수정하고도 커가 파일을 복사했습니다.

[댓글 할 평판이 부족해서 답변을 추가했습니다.]


1

내 소스 디렉토리가 올바른 빌드 컨텍스트에 있었음에도 불구하고이 문제가 발생했습니다. 그 이유는 내 소스 디렉토리가 빌드 컨텍스트 외부의 위치에 대한 심볼릭 링크이기 때문입니다.

예를 들어 내 Dockerfile에는 다음이 포함됩니다.

COPY dir1 /tmp

경우 dir1는 A 심볼릭 링크 COPY명령은 내 경우에는 작동하지 않습니다.


0

그래서 이것은 최근에 몇 번 일어났습니다. .Net 개발자로서 VisualStudio를 사용하여 빌드 이름을 SomeThing에서Something DLL 이름으로하지만이있는 상태를 그대로 유지 .csproj 파일을 변경하지 않습니다SomeThing.csproj

Dockerfile은 Linux 대소 문자를 구분하는 파일 이름을 사용하므로 새로 자동 생성 된 Dockerfile이 복사를 시도했습니다. Something.csproj 찾을 수없는 . 그래서 수동으로 파일 이름을 바꾸면 (소문자로) 모든 것이 작동합니다.

하지만 ... 여기에 경고가 있습니다. 내 Windows 랩톱에서이 파일 이름 변경은 Git에 의해 선택되지 않으므로 repo 소스가 여전히 SomeThing.csprojrepo에 있었고 CI / CD 프로세스 중에 Docker 빌드가 동일한 이유로 실패했습니다.

저장소에 대한 커밋으로 파일 이름을 직접 변경해야했습니다.

tl; dr Windows O / S에서 파일 이름 대소 문자 구분을 확인하고 로컬 파일 이름이 Git 변경으로 선택되지 않으므로 CI / CD를 사용하는 경우 리포지토리도 수정되었는지 확인하십시오.


0

여기에 이미 몇 가지 훌륭한 답변이 있습니다. 나를 위해 일한 것은 주석을 다음 줄로 옮기는 것이 었습니다.

나쁨 :

WORKDIR /tmp/app/src # set the working directory (WORKDIR), so we can reference program directly instead of providing the full path.
COPY src/ /tmp/app/src/ # copy the project source code

좋음 :

WORKDIR /tmp/app/src
  # set the working directory (WORKDIR), so we can reference program directly instead of providing the full path.
COPY src/ /tmp/app/src/
  # copy the project source code
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.