10

docker イメージに追加する 300Mb までの圧縮ローカル ファイルがあります。次に、次の状態で画像を抽出します。

問題は、ADD ステートメントの結果としてコミットが発生し、その結果、新しいファイル システム レイヤーによってイメージが必要以上に最大 300Mb 大きくなることです。

ADD /files/apache-stratos.zip /opt/apache-stratos.zip
RUN unzip -q apache-stratos.zip && \
    rm apache-stratos.zip && \
    mv apache-stratos-* apache-stratos

質問: コミットを発生させずにローカル ファイルを追加するための回避策はありますか?

python -m SimpleHTTPServer1 つのオプションは、docker ビルドを開始する前に単純な Web サーバー (例: ) を実行し、それから を使用wgetしてファイルを取得することですが、これは少し面倒です。

RUN wget http://localhost:8000/apache-stratos.zip && \
    unzip -q apache-stratos.zip && \
    rm apache-stratos.zip && \
    mv apache-stratos-* apache-stratos

もう 1 つのオプションは、ビルド時ではなくコンテナーの起動時に zip ファイルを抽出することですが、起動をできるだけ速く保つことをお勧めします。

4

4 に答える 4

13

ドキュメントによると、アーカイブ ファイルをローカル ファイルシステム (URL ではなく) から Dockerfile の ADD に渡すと (パス + ファイル名ではなく、宛先パスを指定して)、指定されたディレクトリにファイルが解凍されます。

<src> が認識された圧縮形式 (identity、gzip、bzip2、または xz) のローカル tar アーカイブである場合、ディレクトリとして解凍されます。リモート URL からのリソースは解凍されません。ディレクトリがコピーまたはアンパックされると、tar -x と同じ動作になります。結果は次の結合になります。

1) 宛先パスに存在していたもの、および 2) ソース ツリーの内容。"2" を優先して競合が解決されました。ファイル単位で。

試す:

ADD /files/apache-stratos.zip /opt/

さらに解凍せずに、ファイルが存在するかどうかを確認します。

于 2014-08-30T22:41:20.507 に答える
3

docker-squashを使用して、新しく作成されたレイヤーを押しつぶすことができます。これにより、画像サイズが大幅に縮小されるはずです。

残念ながら、言及された回避策 ( RUN curl ... && unzip ... & rm ...、コンテナーの開始時に展開する) が現時点で唯一のオプションです (docker 1.11)。

于 2016-05-31T10:16:21.920 に答える
1

現在、私が考えることができる3つのオプションがあります。


オプション 1: zip ファイルから tar または圧縮 tar 形式に切り替えてから、ADDファイルを解凍することができます。

ADD /files/apache-stratos.tgz /opt/

唯一の欠点は、ディレクトリの名前変更などの他の変更により、書き込み時にコピーが再度トリガーされることです。そのため、tar ファイルの内容が最終的なディレクトリ構造に含まれていることを確認する必要があります。


オプション 2: マルチステージ ビルドを使用します。初期段階でファイルを抽出し、変更を行ってから、結果のディレクトリを最終段階にコピーします。これは、BuildKit を使用できないビルド エンジンに適したオプションです。オーグラの答えはこれをカバーしているので、彼がすでに持っているのと同じDockerfileを繰り返さない.


オプション 3: BuildKit (18.09 以降で使用可能) を使用すると、RUNコマンド内で、ビルド コンテキストを含む他の場所からファイルをマウントできます。これには現在、実験的な構文が必要です。結果の Dockerfile は次のようになります。

# syntax=docker/dockerfile:experimental
FROM ...
...
RUN --mount=type=bind,source=/files/apache-stratos.zip,target=/opt/apache-stratos.zip \
    unzip -q apache-stratos.zip && \
    rm apache-stratos.zip && \
    mv apache-stratos-* apache-stratos

それをビルドするには、ビルドを実行する前に変数をエクスポートします (.bashrc または同等のものでエクスポートすることもできます)。

DOCKER_BUILDKIT=1 docker build -t your_image .

BuildKit の実験的機能の詳細については、https ://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md をご覧ください。

于 2019-06-06T19:19:47.837 に答える