私の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を見つけることができないのですか?
ドキュメントから:
<src>
パスビルドのコンテキスト内にある必要があります; ../something/somethingをコピーすることはできません。Dockerビルドの最初のステップは、コンテキストディレクトリ(およびサブディレクトリ)をdockerデーモンに送信することです。
/srv/visitor
を使用すると、実際には現在のディレクトリであっても、ビルドコンテキスト外の絶対パスが使用されます。
次のように、ビルドコンテキストをより適切に整理します。
├── /srv/visitor
│ ├── Dockerfile
│ └── resources
│ ├── visitor.json
│ ├── visitor.js
そして使用:
COPY resources /srv/visitor/
注意:
docker build - < Dockerfile
にはコンテキストがありません。
したがって、使用
docker build .
私にとって、ディレクトリは正しいコンテキストにあり、プロジェクトのルートにある(非表示の).dockerignore
ファイルに含まれていました。これにより、エラーメッセージが表示されます。
lstat mydir/myfile.ext: no such file or directory
私にとっての問題は、私がdocker build - < Dockerfile
documentation から注:STDIN(docker build - < somefile
)、ビルドコンテキストがないため、COPYを使用できません。
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」を実行して削除します。
私はこの問題に遭遇していて、他のディレクトリからDockerfileをロードするために、ビルド変数にコンテキストを追加できることがわかりました。これにより、デフォルトのDockerファイル構造を好みに合わせて少し変更することができました。これが私のdocker-compose.ymlからのスニペットです:
version: '3'
services:
webserver:
build:
context: .
dockerfile: ./server/Dockerfile
...
コンテキストを追加することで、ファイルを参照する場所を定義できました。ここでDockerドキュメントを参照できます: https://docs.docker.com/compose/compose-file/#context
お役に立てれば!
次のエラーの場合、
COPY failed: stat
Dockerサービスを再起動して回避しました。
ファイルは、現在のビルドコンテキスト内のディレクトリにある必要があるだけでなく、ビルドコンテキスト外のファイルへのソフトリンクにすることもできません。
ホームディレクトリにあるファイルへのリンクがあり、リンクはプロジェクトディレクトリにありました。リンクを削除し、リンクされたファイルをプロジェクトに移動した後(rm mylink ; mv ~/myrealfile ./
)、それでうまくいきました。
これは、別のディレクトリからdockerファイルを実行しようとしたときに起こりました。
COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directory
とdockerファイルを指定することでこれを解決することができました。
ランニング docker build . -f docker/development/Dockerfile
機能しました。
ただし、Running
docker build docker/development/Dockerfile`を実行すると、この問題が発生しました。
-f
または--file
は、Dockerfile
の名前と場所を指定します。
アプリのルートディレクトリにDockerfile
があると問題なく動作したため、最初は不思議でした。これは、環境のDockerファイルをもう少しよく管理したい場合に役立ちます。
私の場合、この問題を最後に解決したのは、コピーを実行するDockerfileがプロジェクトのより深いレベルにあったためです。そのため、ホストのビルドパスがDockerfileのファイルの場所を基準にして表現されていることに気付きました。
私にとっての問題は、追加しているファイル名の末尾にスペースがあることでした。名前を変更して修正しました。