Dockerイメージのコンテキストを非常に大きくする


142

Dockerfileを整理しておくためだけにDockerについて学びたいので、ホストマシンにいくつかの異なるディレクトリを作成しました。今実行したDockerfileは次のようになります。

FROM crystal/centos
MAINTAINER crystal

ADD ./rpms/test.rpm ./rpms/ 
RUN yum -y --nogpgcheck localinstall /rpms/test.rpm 

私の実際のrpmはわずか1 GBです。しかし、実行しようとするとsudo docker build -t="crystal/test" .、ビルドコンテキストがDockerデーモン3.5 GBに送信されます。Dockerイメージをビルドし続けていると、他に気付かないことがありますか?ホストマシン上の他のディレクトリにさらにイメージを作成すると、メモリが蓄積されますか?


2
ビルドコンテキストは、現在のディレクトリ内のすべてのファイル/ディレクトリです。
Nabin、

ビルドに必要なファイルのみをこのディレクトリに保存します。つまり、Dockerfileと、Dockerfile内のビルドイメージにコピー/追加されたローカルファイル/ディレクトリ。また、.dockerignore
Vishrant

回答:


266

Dockerクライアントは、「ビルドコンテキスト」全体をDockerデーモンに送信します。そのビルドコンテキスト(デフォルト)は、そのディレクトリ全体(つまりツリーDockerfile全体rpms)です。

.dockerignoreDockerが一部のファイルを無視するようにファイルを設定できます。実験してみてください。

また、あなたは移動することができrpms、フォルダ1つのディレクトリあなたの上のレベルDockerfile、そして唯一のシンボリックリンクをtest.rpmDockerfileのディレクトリ。


多くのユーザーがコメントで指摘したように、.gitフォルダーを.dockerignore追加する必要があります。これは、私の場合150MB-> 5GBの違いの原因でした。


4
残念ながらADD、ビルド中にコマンドがシンボリックリンクをたどらないため、この場合はシンボリックリンクを作成できないようです。参照:github.com/docker/docker/issues/1676
JimmidyJoo

5
命の恩人!Rails開発者:必ず+他のカスタムカスタムに追加tmp logしてください.dockerignore
同等のもの8

7
.docフォルダーを.dockerignoreファイルに追加することを忘れないでください(gitを使用している場合)
dsncode

8
はい、.gitフォルダはデフォルトで含まれています-これは間違いなく私を捕まえました。
Paul Suart

1
「ビルドコンテキスト」とは正確には何ですか?docker build RUNコマンドを使用してこれらのファイルを検索しようとしましたが、dockerfilesystem内のDockerfileフォルダーにファイルが表示されません(ビルド時)。ビルドコンテキストがどのように役立つか、簡単な例を教えてもらえますか?
Patrick

52

2019年更新

Docker v18.06以降、ビルドキットと呼ばれる新しいイメージビルダーを使用するオプションがあります。

Dockerにあらかじめバンドルされているため、何もインストールする必要はありません。Dockerfile構文との下位互換性があるため、を変更する必要はありませんDockerfile

レガシーDockerビルドと新しいDocker BuildKit

ビルドディレクトリに未使用の巨大なファイルがあるイメージをビルドする例を次に示します。

レガシーDockerビルド:

$ time docker image build --no-cache .
Sending build context to Docker daemon  4.315GB
[...]
Successfully built c9ec5d33e12e

real    0m51.035s
user    0m7.189s
sys 0m10.712s

新しいDocker BuildKit:

$ time DOCKER_BUILDKIT=1 docker image build --no-cache .
[+] Building 0.1s (5/5) FINISHED                                                
 => [internal] load build definition from Dockerfile                       0.0s
 => => transferring dockerfile: 37B                                        0.0s
 => [internal] load .dockerignore                                          0.0s
 => => transferring context: 2B                                            0.0s
[...]
 => => writing image sha256:ba5bca3a525ac97573b2e1d3cb936ad50cf8129eedfa9  0.0s

real    0m0.166s
user    0m0.034s
sys 0m0.026s

唯一の変更はDOCKER_BUILDKIT=1環境変数であり、時間の違いは非常に大きくなります。

.dockerignore ファイル

.dockerignoreファイルはまだ有効であり、有用であることに注意してください。などの一部のDockerfileコマンドCOPY . .は、.dockerignoreルールを考慮に入れます。ただし、ビルドディレクトリ内のサイドファイル(では参照Dockerfileされません)は、BuildKitによって「ビルドコンテキスト」としてコピーされなくなりました。


1
DOCKER_BUILDKITは現在Windowsコンテナではサポートされていないことに注意してください。(Linuxのみ、制限付きでリスト:docs.docker.com/develop/develop-images/build_enhancements
Vaccano

18

私はDockerfileとdocker-compose.ymlをサブフォルダーに移動して修正しましたが、うまくいきました。どうやらdockerは現在のフォルダーをデーモンに送信し、私のフォルダーは9ギグでした。


4
このメソッドはForbiddenパスを提供します:親ディレクトリからのファイルがコピーされている場合のビルドコンテキストエラーの外で、これに対する解決策はありますか?
Kitwradr

8

あなたが持っている場合は.dockerignore、ファイルおよびビルド状況は依然として大きく、あなたが使用してドッキングウィンドウのビルドコンテキストに送られているものを確認することができシルバーサーチャーを

ag --path-to-ignore .dockerignore --files-with-matches

一部の**パターンが正しく機能しない可能性があることに注意してください。

その他のコメントについては、このGithubの問題を参照してください:https : //github.com/moby/moby/issues/16056


4

私の場合、それは私が間違った-f引数で実行したときでした-Dockerfileが置かれたディレクトリへのパスなし

docker build --no-cache -t nginx5 -f /home/DF/Dockerfile /home/DF/ - 正しい

docker build --no-cache -t nginx5 -f /home/DF/Dockerfile - 違う


1

ビルドコンテキストを完全に制御したい場合はCOPY、後でコンテキストや関連データをコンテナーに入れずに、コンテナーを完全にビルドすることもできます。

docker build - < Dockerfile

この欠点の1つは、このアプローチADDでは、ローカルURLからのファイルではなく、リモートURLを参照するdockerfile内のもののみが可能であることです。

https://docs.docker.com/engine/reference/commandline/build/#build-with--を参照してください


0

FreeStylerと同じ問題が発生しました。しかし、私は自分のコンテキストから1つ上のディレクトリから構築していました。したがって、-f引数は正しく、コンテキストは正しくありませんでした。

project 
|
-------docker-dir 

docker-dirからビルドすると、次のようになりました

docker build -t br_base:0.1 . 

dock-dirからのビルドで、ビルドコンテキストが変更されました。したがって、コマンドのコンテキストを変更する必要がありました。コンテキストは「。」で指定されます 上記のコマンドで。

プロジェクトディレクトリからの新しいコマンドは

docker build -t br_base:0.1 ./base

ここのコンテキストは「./base」によって与えられます


0

イメージを作成し、コピーにログ時間をとっているdockerデーモンにビルドコンテキストを送信するメッセージ取得している場合 、

次に.dockerignoreファイルを追加します。コピーする必要のないファイルまたはディレクトリを含める必要があります。


0

の場合NodeJS Application.dockerignoreルートプロジェクトディレクトリに.dockerignoreファイルを追加し、ファイル内に以下を追加します

node_modules
dist
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.