web-dev-qa-db-ja.com

Dockerfile内のファイルへのデータの書き込み

ファイルにいくつかの行を書き込むシェルスクリプト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が見つけられないのはなぜですか?どこで見つけられますか?

9
pcsram

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と表示されるはずです。

5
michael_bitard

これは、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>
1
techtabu