programing

도커 파일에 파일을 복사하는 중인데, 해당 파일이나 디렉토리가 없습니까?

abcjava 2023. 8. 24. 21:46
반응형

도커 파일에 파일을 복사하는 중인데, 해당 파일이나 디렉토리가 없습니까?

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

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

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

해당 파일 또는 디렉터리가 없습니다.

은 나의 나는 "Docker 파일" .docker build - < Dockerfile터미널의 같은 디렉토리에도 있습니다.

내가 여기서 뭘 잘못하고 있는 거지?

를 하세요..dockerignore파일도 있습니다.

매우 드문 경우라는 것은 알지만, 그 파일이 거기에 언급되어 있었습니다.

아마도 당신이 언급한 것 때문에 발생한 것 같습니다.file1/file2/file3Docker는 빌드 컨텍스트에 없는 절대 경로로 빌드 컨텍스트의 경로만 검색합니다.

예: 을 사용하는 경우COPY /home/yourname/file1는 도커빌드다같해이석다니합음과는다▁dock▁as로 해석합니다.${docker build working directory}/home/yourname/file1여기에 같은 이름의 파일이 없으면 파일 또는 디렉터리 오류가 발생하지 않습니다.

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

Dockerfile을 일파복위에 복사합니다.src에▁dest폴더를 누릅니다.당신이 놓친 것처럼 보입니다.file1,file2그리고.file3혹은 그것을 구축하려고 노력하는 것.Dockerfile잘못된 폴더에서.

도커 파일 문서 참조

또한 다음을 구축하기 위한 명령입니다.Dockerfile비슷한 것이어야 합니다.

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

명령어는 다음과 같습니다.

docker build -t imagename .

그리고:

docker build -t imagename - < Dockerfile2

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

docker build -t imagename -f Dockerfile2 .

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

중입니다.docker build . -f docker/development/Dockerfile응용프로그램 루트가 아닌 지정된 디렉토리에서 도커 파일을 실행할 수 있습니다.

사용하다-f또는--file합니다.Dockerfile.

다른 디렉터리에서 도커 파일을 실행하려고 할 때 이 문제가 발생했습니다.

는 는나를 요.COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directory도커 파일을 지정하여 이 문제를 해결했습니다.

그랬다.docker build docker/development/Dockerfile그것이 나에게 이 문제를 일으켰습니다.

처음에는 이상하다고 생각했는데, 왜냐하면 내가 그것을 가졌을 때.Dockerfile앱 루트 디렉터리에서 잘 작동했습니다.이렇게 하면 환경 도커 파일을 좀 더 잘 관리하려는 경우에 도움이 됩니다.

저는 방금 이 문제를 경험했고 여기 있는 어떤 제안도 제 문제를 해결하지 못했습니다.파일에 잘못된 줄이 있어서 적절한 줄 끝으로 변경해야 했습니다.(이 경우 CRLF에서 LF로, Ubuntu 14.04는 내가 윈도우에서 편집하던 스크립트를 인식할 것입니다.)

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

이것이 누군가에게 도움이 되기를 바랍니다.

docker build - < Dockerfile또는Get-Content .\Dockerfile | Docker build -PS에서 상황을 파악하지 못할 수 있습니다.는 당신이 을 사용하는 것을 합니다.

Docker build -f .\Path\Dockerfile . 

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

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

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

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

COPY resources /root/folder/

어디에

*resources - Docker 파일이 있는 동일한 폴더에 만든 로컬 폴더

*/root/folder/ - 컨테이너에 있는 폴더

약간 바보 같은 느낌이 들지만, 제 문제는 제가 도커 컴포지를 실행하고 있었고, 제 도커 파일이 ./deploy 하위 디렉터리에 있었다는 것입니다.내 ADD 참조는 Docker 파일이 아니라 프로젝트 루트에 상대적이어야 합니다.

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

어쨌든, 누군가 같은 문제에 부딪혔을 때를 대비해서 글을 올려야겠다고 생각했습니다.

복사에 대한 이전 호출은 디렉터리를 변경하는 것일 수 있습니다.

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/

오래된 일인 건 알지만, 지적할 점이 있습니다.모든 것이 원래대로라고 생각한다면, 당신의 .gitignore 파일을 확인하세요 :)

폴더가 로컬에 있을 수 있지만, Git ignore에 폴더가 있으면 서버에 없습니다. 즉, Docker는 존재하지 않으므로 해당 폴더를 찾을 수 없습니다.

비슷하고 트슬개티스의 대답 덕분에, 그 후.

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).

로그를 가 그로확인도사것용로으를 한다고 되어있습니다..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(대신 화이트리스트로 사용) 도커가 파일을 복사했습니다.

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

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

예를 들어 내 Docker 파일에는 다음이 포함됩니다.

COPY dir1 /tmp

한다면dir1는 징적인연다니결입상의 상징적인 입니다.COPY제 경우에는 명령어가 작동하지 않습니다.

문제는 여기에 있습니다.

STDIN(도커 빌드 - < some file)을 사용하여 빌드하면 빌드 컨텍스트가 없으므로 COPY를 사용할 수 없습니다.

자세한 내용은 https://docs.docker.com/engine/reference/builder/ #copy

다음과 같은 방법으로 도커를 구축하면 됩니다.

docker build -t name-of-your-tag .

다음 오류에 대해,

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

저는 도커 서비스를 다시 시작함으로써 그것을 해결했습니다.

sudo service docker restart

Docker put_archive에서 파일을 찾을 수 없습니다.도커용 파이썬 API를 사용하고 있습니다.도커 버전 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'])

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

동일한 코드가 다른 실행 순서로 작동합니다.

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

당신이 옳은 일을 했다고 확신하지만 도커가 여전히 불평한다면, 이 문제를 살펴보십시오: https://github.com/moby/moby/issues/27134 .
엔진을 하는 것 같습니다.service docker restart이 문제를 해결할 수 있습니다.

이 문제에 대한 수정 사항을 검색하는 중이었는데 ADD 또는 COPYING 중인 폴더가 빌드 폴더, 위의 여러 디렉토리 또는 /에서 참조된 폴더에 없습니다.

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

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

도커 파일에 추가해야 합니다.

ADD /your_dir_to_copy /location_in_container

그런 다음 /your_syslog_to_copydir의 상위 항목으로 이동해야 합니다.

그런 다음 이 명령을 실행합니다.

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

컨테이너를 생성한 후

docker run -ti --rm cordova bash

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

우연히 이것을 만났어요.일부 디렉터리를 복사하지 못했습니다.파일을 복사했습니다..gitignore(.dockerignore 뿐만 아니라)에 포함된 파일도 무시되기 때문인 것으로 나타났습니다.참조: https://github.com/zeit/now/issues/790

제가 직접 부딪혔지만, 여기 있는 어떤 해결책도 효과가 없었습니다.

마지막으로, 그 이유는 제가 잘못된 컨테이너를 가동하고 있었기 때문입니다.컨테이너/이름을 빌드하고 이전에 빌드된 컨테이너/이름:1.0을 실행하고 있었습니다.

즉, 동일한 컨테이너를 빌드하고 실행하는지 확인합니다.

최근에 이런 일이 몇 번 있었습니다.로서.Netdev, VisualStudio를 사용하여 빌드 이름을 변경했습니다.SomeThing로.SomethingDLL 이름으로 사용되지만 유지되는 .csproj 파일은 변경되지 않습니다.SomeThing.csproj

Docker 파일은 Linux 대소문자를 구분하는 파일 이름을 사용하므로 새로 생성된 Docker 파일이 복사하려고 했습니다.Something.csproj찾을 수 없었던 것입니다.그래서 수동으로 파일 이름을 변경(소문자로 만들기)하여 모든 작업이 수행되었습니다.

하지만... 여기 경고문이 있습니다.Windows 노트북의 이 파일 이름 변경이 Git에 의해 선택되지 않아 저장소 원본이 여전히 유지되었습니다.SomeThing.csproj및했습니다...repo 및 CI/CD 로커드가동일한이유로실다니습패했빌에도.

레포에 대한 커밋으로 파일 이름을 직접 변경해야 했습니다. 약간의 해결책이 있었지만 저는 계속했습니다.

tl;dr Windows OS에서 파일 이름 대소문자가 민감한지 확인하고 로컬 파일 이름이 Git 변경으로 선택되지 않으므로 CI/CD를 사용하는 경우 레포도 수정되었는지 확인합니다.

언급URL : https://stackoverflow.com/questions/32997269/copying-a-file-in-a-dockerfile-no-such-file-or-directory

반응형