ファイルにいくつかの行を書き込むシェルスクリプトscript.shがあります。
#!/usr/bin/env bash
printf "blah
blah
blah
blah\n" | Sudo tee file.txt
今私のDockerfileで、このスクリプトを追加して実行し、生成されたfile.txt
を追加しようとします。
ADD script.sh .
RUN chmod 755 script.sh && ./script.sh
ADD file.txt .
上記を実行すると、ADD file.txt .
コマンドを参照するエラーが発生します。
lstat file.txt: no such file or directory
Shellスクリプトが生成したファイルをdockerが見つけられないのはなぜですか?どこで見つけられますか?
RUN chmod 755 script.sh && ./script.sh
実際にこのスクリプトを実行しますinside Dockerコンテナー(つまり、Dockerレイヤー内)。
ADD file.txt .
localファイルシステムにファイルを追加しようとします(つまり、新しいdockerレイヤー内)。
File.txtがコンピューターに存在しないため、これを行うことはできません。
実際、このファイルは既にdocker内にあります。docker run --rm -ti mydockerimage cat file.txt
と表示されるはずです。
これは、Dockerが最初にDockerデーモンに(Dockerfileが配置されている)ディレクトリのコンテキスト全体をロードするためです。 Docker docsから、
ビルドは、CLIではなく、Dockerデーモンによって実行されます。ビルドプロセスが最初に行うことは、コンテキスト全体を(再帰的に)デーモンに送信することです。ほとんどの場合、コンテキストとして空のディレクトリから開始し、Dockerfileをそのディレクトリに保持することをお勧めします。 Dockerfileのビルドに必要なファイルのみを追加します。
最初はテキストファイルが利用できなかったため、そのエラーメッセージが表示されます。それでもそのテキストファイルをDockerイメージに追加したい場合は、同じスクリプトファイルから「docker build」コマンドを呼び出すことができます。 script.shを変更します。
#!/usr/bin/env bash
printf "blah
blah
blah
blah\n" | Sudo tee <docker-file-directory>/file.txt
docker build --tag yourtag <docker-file-directory>
Dockerfileを変更して、生成されたテキストファイルを追加します。
ADD file.txt
.. <rest of the Dockerfile instructions>