Docker COPYの問題-「そのようなファイルまたはディレクトリはありません」


38

私の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

「package.jsonファイルが見つかりません」という行に沿って何かがはっきりとあると言った。

更新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を見つけることができないのはなぜですか?


2017年に問題を探している人のために-これはあなたの問題github.com/docker/for-mac/issues/1922かもしれません。.dockerignoreファイルを削除して再テストすることをお勧めします。それが機能する場合、.dockerignoreの設定をいじって問題を解決できます。
未定義

回答:


36

ドキュメントから:

<src>パスは、ビルドのコンテキスト内でなければなりません。Dockerビルドの最初のステップはコンテキストディレクトリ(およびサブディレクトリ)をdockerデーモンに送信することであるため、../something / somethingをコピーすることはできません。

使用/srv/visitorするときは、ビルドコンテキストが実際に現在のディレクトリであっても、ビルドコンテキストの外部の絶対パスを使用しています。

ビルドコンテキストは次のように整理します。

├── /srv/visitor
│   ├── Dockerfile
│   └── resources
│       ├── visitor.json
│       ├── visitor.js

そして使用:

COPY resources /srv/visitor/

注意:

docker build - < Dockerfile コンテキストがありません。

したがって、使用、

docker build .


私はすでにホストシステムの「/ srv / visitor」ディレクトリ内にあり、すべてのソースコードとDockerfileがここにあります。このすべてのソースがコンテナの「/ srv / visitor」ディレクトリ内にコピーされるように、「COPY」ステートメントをどのように記述する必要がありますか?
dsljanus

1
@dsljanusソースディレクトリまたはファイルは、ビルドコンテキスト、つまりディレクトリに対して相対的でなければなりません/srv/visitor
ザビエルルーカス

だから、それは「。」である必要がありますか?私はそのようにしていたので、ビルドプロセスは次のステップ「RUN npm install」で停止したからです。「package.jsonファイルが見つかりません」という行に沿って何かを言いました。私のアップデートもご覧ください。
-dsljanus

2
@dsljanusでは、どこからnpmを実行していますか?全体のdockerfileを投稿してください...質問でこのような複数の更新を修正しないでください。1つの問題からまったく別の問題にジャンプするのは本当に面倒です。SFの目的は、明確な答えを得るために明確な質問を投稿することです。
ザビエルルーカス

1
それが問題ですので、[OK]を@dsljanus、使用していないRUN cdが、使用WORKDIR、現在のディレクトリが各ステップ間で記憶されるように。dockerfileは、docker run + docker commitのラッパーにすぎないため、各ステップは前のレイヤーに対して独立して実行されます。これは/、このディレクティブを使用しない場合、各ステップでpwdが等しいことを意味します。
ザビエルルーカス

41

私にとって、ディレクトリは正しいコンテキストに.dockerignoreあり、プロジェクトのルートにある(隠された)ファイルに含まれていました。これにより、エラーメッセージが表示されます。

lstat mydir/myfile.ext: no such file or directory

3
あなたは意味.dockerignore?それはちょうど私に起こった
マーティンコル

5
お大事に!ディレクトリ全体を持っていたので、忘れていたことを無視していたため、ビルドが壊れました。小さな注意点として、あなたは持つディレクトリ内に1つのファイルを非無視することができます!path/to/my/file場合でも、pathです.dockerignore
hjc1710

これは良いものです。
Gudlaugur Egilsson

このことに私がどれほど感謝しているのか、過去1日間自分自身を拷問していたことを表現できません。VSツールがドッキングウィンドウのためにそれで*と.dockerignoreが含まれる理由はまだそれを得ることができない
bilal.haider

十分に賛成票を投じることができません!
kmansoor

7

私にとって問題は、私が使用していたことでした docker build - < Dockerfile

ドキュメントから 注:STDIN(docker build - < somefile)を使用してビルドする場合、ビルドコンテキストがないため、COPYは使用できません。


1

Xavier Lucas [非常に役立つ]の答えが述べているように、ビルドコンテキスト以外のディレクトリ( "docker build"を実行するフォルダは.Dockerfileと同じディレクトリである必要があります)からCOPYまたはADDを使用できません。シンボリックリンクを使用しようとしても、機能しません。

注:これはPOSIX(Linux、Unix、Mac、Windows用のLinux Subsystemの場合もあります)に固有です。Windowsでは、JUNCTIONを使用して同様のことができる場合があります。

cd ~/your_docker_project/
cp -al /subfolder/src_directory ./
echo "COPY src_directory /subfolder/" >> Dockerfile

危険:これを使用すると、Dockerプロジェクトがホスト固有になります。これを行うことはほとんどありません!取扱注意。

アプリケーション:開発環境での学習、実験

これは私のためにトリックをしました。cp -alは、ディレクトリ構造をコピーし、すべてのファイルのハードリンクを作成します。完了したら、「rm -rf ./src_directory」を実行して削除します。


私の目的:ローカルファイルシステムのキャッシュパッケージをdockerイメージにコピーします。必要なツールをインストールします(キャッシュを使用するか、新しいものをダウンロードします)。次に、イメージ内のキャッシュを削除し、ホスト上のハードリンクを削除します。ホストにこれらのファイルがない場合、心配はありません。しかし、帯域幅とドライブスペースが制限されています。これは許容できる使用ですか?
TamusJRoyce

1

この問題にぶつかり、他のディレクトリからDockerfileをロードするために、ビルド変数にコンテキストを追加できることがわかりました。これにより、デフォルトのDockerファイル構造を好みに合わせてもう少し変更することができました。これは私のdocker-compose.ymlからの抜粋です:

version: '3'
services:
  webserver:
    build:
      context: .
      dockerfile: ./server/Dockerfile
    ...

コンテキストを追加することで、ファイルを参照する場所を定義できました。Dockerドキュメントは、https://docs.docker.com/compose/compose-file/#contextで参照できます。

お役に立てれば!


0

私にとって問題は、追加するファイル名の末尾にスペースがあったことです。名前の変更により修正されました。


0

次のエラーの場合、

COPY failed: stat

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


0

私の場合、この問題を最終的に解決したのは、コピーを実行するDockerfileがプロジェクトのより深いレベルにあったことです。そのため、ホストのビルドパスはDockerfileのファイルの場所を基準にして表されていることに気付きました。


0

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

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

動作しdocker build . -f docker/development/Dockerfileました。

しかし、Runningdocker build docker / development / Dockerfile`を実行すると、この問題が発生しました。

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

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


0

ファイルは現在のビルドコンテキストのディレクトリにある必要があるだけでなく、ビルドコンテキスト外のファイルへのソフトリンクにすることもできません。

ホームディレクトリにファイルへのリンクがあり、そのリンクはプロジェクトディレクトリにありました。リンクを削除し、リンクされたファイルをプロジェクトに移動したrm mylink ; mv ~/myrealfile ./後()、動作しました。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.