web-dev-qa-db-ja.com

dockerfileからホストにファイルをコピーする方法は?

Dockerfileが正常にビルドされたときにいくつかのファイルを取得したいのですが、コンテナーからホストにファイルがコピーされません。

つまり、dockerfileをビルドしたとき、ファイルはすでにホストになっています。

13
Allen

ビルドするとき、ホストからビルドしているイメージにファイルをコピーする機会があります( COPYディレクティブ または ADD

containerdocker run 'dされたイメージ)からホストに docker cp ((docker cp)==()を使用してファイルをコピーすることもできます。通常、cpはホストからコンテナにもコピーできます)

ただし、「Dockerfileから」コピーすることはできません。Dockerfileは、イメージの構築方法を指定する単なるレシピです。

ビルド中に生成された可能性のあるいくつかのファイルをホストに戻したい場合(たとえば、 スクリプトの呼び出し その sslを生成 )、コンテナーを実行できます、ホストからフォルダをマウントし、cpコマンドを実行します。

たとえば、これを参照してください getcrt script

docker run -u root --entrypoint=/bin/sh --rm -i -v ${HOME}/b2d/Apache:/Apache apache << COMMANDS
pwd
cp crt /Apache
cp key /Apache
echo Changing owner from \$(id -u):\$(id -g) to $(id -u):$(id -u)
chown -R $(id -u):$(id -u) /Apache/crt
chown -R $(id -u):$(id -u) /Apache/key
COMMANDS

COMMANDSの間はすべて、コンテナで実行されるコマンドです。これには、ホスト${HOME}/b2d/Apacheフォルダにコピーされるcpコマンドが含まれ、コンテナ内に/Apacheとして-v ${HOME}/b2d/Apache:/Apacheとしてマウントされます。

つまり、コンテナ内の/Apacheに何かをコピーするたびに、実際にはホスト上の${HOME}/b2d/Apacheにコピーしていることになります。

7
VonC

おそらく、ホストからフォルダーをボリュームとしてマウントし、そこにファイルを置くことができますか?通常、マウント時に読み取り専用オプションを指定しない限り、マウントされたボリュームはコンテナ内から書き込むことができます。

docker run -v ${PWD}:/<somewritablepath> -w <somewritablepath> <image> <action>
1

Dockerfile機能を介して直接サポートされていませんが、ビルドされたDockerイメージからファイルをコピーできます。

containerId=$(docker create example:latest)
docker cp "$containerId":/source/path /destination/path
docker rm "$containerId"
0