web-dev-qa-db-ja.com

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

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

40
dlyk1988

ドキュメントから:

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

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

次のように、ビルドコンテキストをより適切に整理します。

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

そして使用:

COPY resources /srv/visitor/

注意:

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

したがって、使用

docker build .

37
Xavier Lucas

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

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

私にとっての問題は、私がdocker build - < Dockerfile

documentation から注:STDIN(docker build - < somefile)、ビルドコンテキストがないため、COPYを使用できません。

7
Adam

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

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

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

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

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

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

2
TamusJRoyce

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

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

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

お役に立てれば!

1
Ron

次のエラーの場合、

COPY failed: stat

Dockerサービスを再起動して回避しました。

1
Vineeth

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

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

0
Loduwijk

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

COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directoryとdockerファイルを指定することでこれを解決することができました。

ランニング docker build . -f docker/development/Dockerfile機能しました。

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

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

アプリのルートディレクトリにDockerfileがあると問題なく動作したため、最初は不思議でした。これは、環境のDockerファイルをもう少しよく管理したい場合に役立ちます。

0
A Star

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

0
EmilianoPe

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

0
Hawkeye