Dockerfile内のファイルをコピーしますが、そのようなファイルやディレクトリはありませんか?


98

ルート(〜)フォルダにDockerfileを設定しています。私のファイルの最初の3行は次のようになります。

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ファイルをフォルダーにコピーsrcdestます。あなたのようなルックスのいずれか不足しているfile1file2およびfile3または構築しようとしてDockerfile間違ったフォルダから。

DockerfileDocを参照してください

また、を構築するためのコマンドはDockerfile次のようになります。

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

3
その2番目のコマンドは私にとって失敗し、「ビルド」には1つの引数が必要であると言います。
GreenGodot 2015年

ああ-今すぐcmdを更新してください。Dockerfileについて言及する必要はありません。
askb 2015年

3
リンクを正しく読んだ後、DockerFileがルートフォルダにまったく存在してはならないことがわかりました。すべてをサブディレクトリに移動し、buildコマンドを実行すると、実行されます。あなたの答えは最も役に立ちましたので、私はそれを正しいとマークします。
GreenGodot 2015年

49
また、Docker Ignoreファイルがある(ない)かどうかも確認してください。
トニー

258

.dockerignoreファイルもチェックしてください。

これは非常にまれなケースですが、そのファイルについてはそこで言及しました。


3
なんてこった、ありがとう。Javaプロジェクトの名前(したがってアーティファクトとビルドディレクトリ)を変更ripgrepしていましたが、ドットファイルを検索しないため、古いディレクトリへの最後の厄介な参照が表示されませんでした。
マーティンレーマン

4
headsupためのおかげで、私の場合は、ドッキングウィンドウのVisual Studioウィザードを使用していたし、それが最初の行に*を.dockerignoreを追加:(
lacripta

何らかの理由で、私のデフォルトの.dockerignoreには** \ binが含まれています。Dockerデスクトップによって生成されたと確信しています。
スティーブスミス

ahhghgghghgは、結局のところそれほど珍しいケースではないようです!!!。百万年でそれを理解しなかっただろう。しばらく前にディレクトリを追加し、完全に忘れました。それは非常に遅い任意のビルドを作ること、それを追加するための理由は、...それはgitのをどう考えている
Tahicheの

1
真剣に、それは何のエラーです。それを指摘してくれてありがとう!
taiBsu

37

file1 / file2 / file3をビルドコンテキストにない絶対パスとして参照していることが原因である可能性があります。Dockerはビルドコンテキストでのみパスを検索します。

たとえば、COPY / home / yourname / file1を使用する場合、Dockerビルドはそれを$ {dockerbuild作業ディレクトリ} / home / yourname / file1として解釈します。ここに同じ名前のファイルがない場合、ファイルまたはディレクトリエラーはスローされません。

Dockerの問題の1つを参照してください


ある種の絶対パスの問題があり、「COPYrelative / path / x」しかできません。「COPY / abstract / path / y。」ができません。理由は誰にもわかりませんか?
アレクサンダーミルズ2016

8
@AlexanderMills Dockerfilesは、ホストマシン上で独立して実行可能であり、Dockerfileに関連するパスで使用可能な追加ファイルとともに出荷されることになっています。絶対パスを使用すると、マシン上でのみ実行可能になります。
kciesielski 2016

それは私のADD指令の問題でもありました、ありがとう。
vmonteco 2017

私はこれを知りませんでした。ファイルがdockerfileと一緒に含まれるように変更すると、実際には完全に機能しました。他のソースの場所から(/ dir / dir2 / fileなどのフルパスとして)それを取得したとき、それは機能していませんでした。それがdockerfileとしていくつかのディレクトリにあるか、その子である場合に機能します
NewteqDeveloper19年

22

コマンドのようです:

docker build -t imagename .

そして:

docker build -t imagename - < Dockerfile2

同じ方法で実行されません。DockerfileとDockerfile2を使用して1つのフォルダー内から2つのDockerイメージをビルドする場合、stdin(<Dockerfile2)を使用する2番目の例ではCOPYコマンドを使用できません。代わりに、以下を使用する必要があります。

docker build -t imagename -f Dockerfile2 .

その後、COPYは期待どおりに機能します。


17

実行docker build . -f docker/development/Dockerfileは機能しました。これにより、アプリケーションのルート以外の指定されたディレクトリからDockerファイルを実行できます。

-fまたは--fileを使用して、の名前と場所を指定しますDockerfile

これは、別のディレクトリからdockerファイルを実行しようとしたときに発生しました。

私が持っていたCOPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directoryとドッキングウィンドウのファイルを指定することでこの問題を解決するために管理します。

それがdocker build docker/development/Dockerfile私にとってこの問題を引き起こしたのです。

Dockerfileアプリのルートディレクトリにあるときはうまく機能したので、最初は奇妙だと思いました。これは、環境のDockerファイルをもう少しうまく管理したい場合に役立ちます。


1
docker build . -f docker/development/Dockerfileこれは機能します
PradeepSurale20年

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 / -コンテナのフォルダ


2

私はこれが古いことを知っていますが、指摘すべきことがあります。すべてが想定どおりであると思われる場合は、.gitignoreファイルを確認してください:)

フォルダーがローカルにある可能性がありますが、フォルダーがgitにある場合は無視し、サーバー上にはありません。つまり、Dockerはそのフォルダーが存在しないため、そのフォルダーを見つけることができません。


1

次のエラーについては、

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

Dockerサービスを再起動することで回避できました。

sudo service docker restart

1

Dockerput_archiveでファイルが見つかりませんエラー。Docker用のPythonAPIを使用しています。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")

作成したDockerコンテナにファイルをコピーできません。

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

操作の順序を変更してもエラーは発生せず、ファイルは希望どおりに正確にコピーされます。だから私は自分のコードが機能していて、自分がやりたいことをしていることを知っています。ただし、開始する前に構成ファイルをコンテナーにコピーすることが重要です。開始後にファイルをコピーすると、コンテナーはデフォルト構成で開始され、コンテナーが開始される前に所定の位置にコピーする必要があるカスタム構成ではありません。Dockerは、この問題は解決されたと主張していますが、それでもアプリケーションに影響を及ぼしています。

これは機能します。同じコードの実行順序が異なります。

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

1

あなたが正しいことをしたと確信しているが、dockerがそれでも文句を言う場合は、この問題を見てくださいhttps//github.com/moby/moby/issues/27134
これでやけどを負いました。Dockerエンジンservice docker restartを再起動すると、この問題は解決するようです。


1

私はこれに対する修正を探していました、そして私が追加またはコピーしていたフォルダはビルドフォルダ、上記の複数のディレクトリ、または/から参照されていませんでした

フォルダーをビルドフォルダーの外部からビルドフォルダーに移動すると、問題が修正されました。


1

stdinを使用せず、コンテキストを維持する方法の1つは、次のとおりです。

1)Dockerfileに、追加する必要があります

ADD /your_dir_to_copy /location_in_container

2)その後、/ your_dir_to_copydirの親に移動する必要があります

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

私はこれに遭遇しました。一部のディレクトリのコピーが機能しませんでした。ファイルをコピーしました。(.dockerignoreだけでなく).gitignoreに含まれるファイルも無視されるためであることが判明しました。参照:https//github.com/zeit/now/issues/790


コピーに失敗COPYための基準の数十-これは、参考にいくつかの一つである.dockerignore犯人として
アルビン

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(代わりにホワイトリストとして使用します)、dockerがファイルをコピーしました。

[コメントするのに十分な評判がないので、答えを追加しました]


1

ソースディレクトリが正しいビルドコンテキストにあるにもかかわらず、この問題が発生しました。その理由は、私のソースディレクトリがビルドコンテキスト外の場所へのシンボリックリンクであったためです。

たとえば、私のDockerfileには次のものが含まれています。

COPY dir1 /tmp

IFがdir1シンボリックリンクであるCOPYコマンドは、私の場合には機能していません。


0

ですから、これは最近数回起こっています。.Net開発者として、VisualStudioを使用して、ビルド名をからSomeThingSomethingDLL名として変更しましたが、これによって、残る.csprojファイルは変更されません。SomeThing.csproj

DockerfileはLinuxの大文字と小文字を区別するファイル名を使用するため、新しく自動生成されたDockerfileは、Something.csproj見つからなかったものをコピーしようとしました。そのため、そのファイルの名前を手動で変更(小文字にする)すると、すべて機能します

しかし...ここに警告があります。私のWindowsラップトップでのこのファイル名の変更はGitによって取得されないため、リポジトリソースはまだSomeThing.csprojリポジトリ上にあり、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.