GNU/Linux >> Linux の 問題 >  >> Linux

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

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

    Linux
    1. Wineからデスクトップにファイルをコピーする方法は?

    2. 別のサーバーとの間でファイルやフォルダーをコピーする方法を学ぶ

    3. マウスなしで xterm からテキストをコピーするにはどうすればよいですか?

    1. あるディレクトリから別のディレクトリに最新の上位 10 個のファイルをコピーする方法は?

    2. scp を使用して複数のファイルを同時にコピーする方法

    3. less からテキストをコピーする方法

    1. ファイル拡張子でファイルを再帰的にコピーする方法は??

    2. プロセスがファイルを書き込めないようにする方法

    3. ファイル名から無効な文字を削除するには?