これは、2019 年 7 月の Docker 19.03.0 で「カスタム ビルド出力」が導入されてから可能になりました。カスタム ビルド出力に関する公式ドキュメントを参照してください。
ビルド プロセス中にビルド イメージからホストへのカスタム ビルド出力を有効にするには、BuildKit を有効にする必要があります。 これは、エンジンがビルド フェーズを実行するための、推奨される後方互換性のある新しい方法です。 BuildKit を有効にするための公式ドキュメントを参照してください。
これには 2 つの方法があります:
<オール>DOCKER_BUILDKIT=1
を設定します 、または"features": { "buildkit": true }
を追加して、デフォルトで Docker エンジンに設定します 構成 json のルートにカスタム ビルド出力に関する公式ドキュメントから:
<ブロック引用>カスタム エクスポーターを使用すると、ビルド アーティファクトを Docker イメージの代わりにローカル ファイルシステム上のファイルとしてエクスポートできます。これは、ローカル バイナリの生成やコード生成などに役立ちます。
...
ローカル エクスポータは、結果のビルド ファイルをクライアント側のディレクトリに書き込みます。 tar エクスポーターは似ていますが、ファイルを単一の tarball (.tar) として書き込みます。
タイプが指定されていない場合、値はデフォルトでローカル エクスポータの出力ディレクトリになります。
...
--output オプションは、ターゲット ステージからすべてのファイルをエクスポートします。特定のファイルのみをエクスポートする一般的なパターンは、マルチステージ ビルドを実行し、COPY --from を使用して目的のファイルを新しいスクラッチ ステージにコピーすることです。
例えばDockerfile の例
FROM alpine:latest AS stage1
WORKDIR /app
RUN echo "hello world" > output.txt
FROM scratch AS export-stage
COPY --from=stage1 /app/output.txt .
実行中
DOCKER_BUILDKIT=1 docker build --file Dockerfile --output out .
出力の末尾は次のとおりです:
=> [export-stage 1/1] COPY --from=stage1 /app/output.txt .
0.0s
=> exporting to client
0.1s
=> => copying files 45B
0.1s
これにより、ローカル ファイル out/output.txt
が生成されます RUN
によって作成された コマンド。
$ cat out/output.txt
hello world
すべてのファイルがターゲット ステージから出力されます
--output
オプションはすべてをエクスポートします ターゲット ステージのファイル。 COPY --from
で非スクラッチ ステージを使用する 余分なファイルが出力にコピーされます。 COPY --from
のスクラッチ ステージを使用することをお勧めします。 .
「Dockerfile から」ホストにファイルをコピーすることはできません サポートされています。 Dockerfile は、イメージのビルド方法を指定する単なるレシピです。
ビルドするとき、ホストからビルドしているイメージにファイルをコピーする機会があります (COPY
を使用) ディレクティブまたは ADD
)
コンテナからファイルをコピーすることもできます (docker run
された画像 'd) docker cp を使用してホストに (実際、cp はホストからコンテナーにもコピーできます)
ビルド中に生成された可能性のあるファイルをホストに戻したい場合 (たとえば、ssl を生成するスクリプトを呼び出すなど)、コンテナーを実行し、ホストからフォルダーをマウントして cp コマンドを実行できます。
たとえば、この getcrt スクリプトを参照してください。
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
の間のすべて cp
を含む、コンテナーで実行されるコマンドです。 ホスト ${HOME}/b2d/apache
でコピーしているもの /apache
としてコンテナー内にマウントされたフォルダー -v ${HOME}/b2d/apache:/apache
で .
つまり、/apache
に何かをコピーするたびに コンテナでは、実際には ${HOME}/b2d/apache
でコピーしています ホストで!
Dockerfile
経由で直接サポートされていませんが
containerId=$(docker create example:latest)
docker cp "$containerId":/source/path /destination/path
docker rm "$containerId"