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, file2및 file3또는 구축을 위해 노력 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.