.dockerignoreファイルがどのように見えるのか、多くの例を見つけることができません。
Puppetを使用してドッカーコンテナーにいくつかのパッケージをインストールすると、イメージが600MBから3GBに爆発します。 .dockerignore
ファイルを使用してサイズを最小にしようとしています
$ cat Dockerfile
FROM centos:centos6
#Work around selinux problem on cent images
RUN yum install -y --enablerepo=centosplus libselinux-devel
RUN yum install -y wget git tar openssh-server; yum -y clean all
Add Puppetfile /
RUN librarian-puppet install
RUN puppet apply --modulepath=/modules -e "class { 'buildslave': jenkins_slave => true,}"
RUN librarian-puppet clean
docker images --tree
を実行すると、画像が数GBずつ瞬時に大きくなることがわかります
$ docker images --tree
├─e289570b5555 Virtual Size: 387.7 MB
│ └─a7646acf90d0 Virtual Size: 442.5 MB
│ └─d7bc6e1fbe43 Virtual Size: 442.5 MB
│ └─772e6b204e3b Virtual Size: 627.5 MB
│ └─599a7b5226f4 Virtual Size: 627.5 MB
│ └─9fbffccda8bd Virtual Size: 2.943 GB
│ └─ee46af013f6b Virtual Size: 2.943 GB
│ └─3e4fe065fd07 Virtual Size: 2.943 GB
│ └─de9ec3eba39e Virtual Size: 2.943 GB
│ └─31cba2716a12 Virtual Size: 2.943 GB
│ └─52cbc742d3c4 Virtual Size: 2.943 GB
│ └─9a857380258c Virtual Size: 2.943 GB
│ └─c6d87a343807 Virtual Size: 2.964 GB
│ └─f664124e0080 Virtual Size: 2.964 GB
│ └─e6cc212038b9 Virtual Size: 2.964 GB Tags: foo/jenkins-centos6-buildslave:latest
イメージが非常に大きくなる理由は、librarian-puppet
がパペットモジュールを/modules
に複製し、ビルドキャッシュが破損するためだと思います
次の.dockerignore
ファイルを試してみましたが、うまくいきませんでした。
$ cat .dockerignore
/modules
/modules/
/modules/*
これは.dockerignore
ファイルの正しい構文ですか?
これらのコンテナが非常に大きくなるのを防ぐ他の方法はありますか?
追加情報:
http://kartar.net/2013/12/building-puppet-apps-inside-docker/
http://danielmartins.ninja/posts/a-week-of-docker.html
.dockerignore
は、docker build
を実行するときにdockerデーモンに送信される初期ビルドコンテキストにファイルが追加されないようにするためです。すべてのイメージで作成されるファイルを除外するためのグローバルルールは作成されませんDockerfileによって生成されます。
各RUN
ステートメントが新しいイメージを生成し、そのイメージの親がその上のDockerfileステートメントによって生成されたイメージであることに注意することが重要です。 RUN
ステートメントを1つにまとめて、イメージサイズを小さくしてみてください。
RUN librarian-puppet install &&\
puppet apply --modulepath=/modules -e "class { 'buildslave': jenkins_slave => true,}" &&\
librarian-puppet clean
どちらでもない:
modules/*
また
modules
私にとってはうまくいかないだろう、dockerはこのように設定するまで不要なファイルで画像を汚染し続けた:
**/modules
以下にも対応しています:
**/modules/*.py
.dockerignore
ファイルは、.gitignore
構文に似ています。ルールの例を次に示します。
# Ignore a file or directory in the context root named "modules"
modules
# Ignore any files or directories within the subdirectory named "modules"
# in the context root
modules/*
# Ignore any files or directories in the context root beginning with "modules"
modules*
# Ignore any files or directories one level down from the context root named
# "modules"
*/modules
# Ignore any files or directories at any level, including the context root,
# named modules
**/modules
# Ignore every file in the entire build context (see next rule for how this
# could be used)
*
# Re-include the file or directory named "src" that may have been previously
# excluded. Note that you cannot re-include files in subdirectories that have
# been previously excluded at a higher level
!src
「ビルドコンテキスト」は、ビルドコマンドの最後に渡すディレクトリであり、通常は現在のディレクトリを示す.
であることに注意してください。このディレクトリは、.dockerignore
で無視したファイルを除くdockerクライアントからパッケージ化され、ビルドを実行するためにdockerデーモンに送信されます。デーモンがクライアントと同じホスト上にある場合でも、ビルドはこのコンテキストからのみ機能し、フォルダーからは直接機能しません。
ビルドには.dockerignore
が1つだけあり、ビルドコンテキストのルートにある必要があります。ホームディレクトリにある場合(サブディレクトリからビルドする場合)、ビルドコンテキストのサブディレクトリからは機能しません。
現在のビルドコンテキストの内容をテストし、.dockerignore
ファイルが正常に動作していることを確認するには、次をコピー/貼り付けします(これは、test-context
という名前のイメージがない場合、上書きされ、その後削除します):
# create an image that includes the entire build context
docker build -t test-context -f - . <<EOF
FROM busybox
COPY . /context
WORKDIR /context
CMD find .
EOF
# run the image which executes the find command
docker container run --rm test-context
# cleanup the built image
docker image rm test-context
より小さいイメージを作成する別の方法は、Dockerではなく ホストでlibrarian-puppetを実行する です。したがって、librarian、Ruby、gems、...画像。
Puppetを使用するjenkinsスレーブ の622MBイメージと、480MB Puppetのないイメージ で終了しました。
http://docs.docker.com/articles/dockerfile_best-practices/
あなたのアプローチは後方にあり(@csanchezに同意)、コンテナでパペットを実行するのではなく、パペットからドッカーコンテナを生成する必要があるようです...
また、&&
install/apply/clean行を一緒に...各dockerコマンドは増分イメージを作成します... centos yum
コマンドの一部である一時/リソースファイルがある場合、同様に同じことを行う必要があります。 。
FROM centos:centos6
# Add your needed files first
# maybe you could use a baseimage and make this a volume mount point?
Add Puppetfile /
# combine multiple commands with cleanup of cache/temporary
# space in the same run sequence to reduce wasted diff image space.
#Work around selinux problem on cent images
RUN yum install -y --enablerepo=centosplus libselinux-devel && \
yum install -y wget git tar openssh-server; yum -y clean all && \
librarian-puppet install && \
puppet apply --modulepath=/modules -e "class { 'buildslave': jenkins_slave => true,}" && \
librarian-puppet clean
私は[〜#〜] really [〜#〜]コンテナ内でSELINUXを避けることを提案しますが、それはあなたに与えませんanythingコンテナ内。言うまでもなく、作成しようとしているものに応じて、centos6から開始する場所は小さくなります。 ubuntuはもっと小さく、debian:wheezyはもっと小さく、小さな出発点はAlpineでさえあると思います。
仮想マウントをサポートするファイルシステムを使用している場合、ファイルサイズが同じベースイメージを複数のインスタンスに再利用できるため、サイズが大きくなることはありませんmore
コンテナイメージサイズの最適化は、。dockerignoreの背後にある主な目標です。これは、。gitignoreサービスを提供しながら、待ち時間と応答時間を短縮するため。 Puppet、SaltStack、Ansibleなどの展開の自動化に当てはまります。イメージサイズが大きく、ネットワーク帯域幅が狭いため、サービス実行の展開用に定義されたタイムスタンプが失敗する場合があります。 .dockerignoreは、画像のサイズをできるだけ小さくするのに役立ちます。
Docker buildコマンドの最後に指定するbuild contextディレクトリに配置できます。ファイルは glob に従い、ファイルとディレクトリが最終ビルドイメージから除外されます。
ビルドコンテキストにディレクトリ。img /があり、イメージのビルド中にそれを除外したい場合、次の行を追加します.dockerignoreファイル、
.img
そして、すべてのファイルを除外したい場合はで始まります。次に、単に行を追加し、
.*
(注:Unix globパターンが正規表現と異なることを混同しないでください)
さらに、ビルドコンテキストからファイルをさらにいくつか除外します。
.*
docs
my-stack.dab
docker-compose.overrride.yml
test*
*.md
!README.md
ここでは、*。md行はすべてのマークダウンファイルを除外しています(プロジェクトに多くのマークダウンファイルがあります)。ただし、README.mdを含め、その他のマークダウンファイルは含めません。上記の最後の行として、README.mdを!で追加するか、他のすべてのマークダウンファイルを除外しながら除外します。
したがって、これにより、。dockerignoreを使用してビルドイメージのオーバーヘッドを削減し、イメージサイズを小さくするために活用できます。
ユースケースに最適なソリューションは、 マルチステージビルド をdockerファイルで使用することだと思います。 Dockerfileは空のディレクトリに存在する必要があり、使い捨てコンテナでpuppetを実行します。
上記のリンクから:
マルチステージビルドでは、Dockerfileで複数のFROMステートメントを使用します。各FROM命令は異なるベースを使用でき、それぞれがビルドの新しいステージを開始します。ある段階から別の段階にアーティファクトを選択的にコピーして、最終画像に不要なものをすべて残すことができます。