[解決済み】Dockerのコンテナイメージが大きいのはなぜですか?
質問
FedoraからDockerfileで簡単なイメージを作りました(初期320MB)。
Nano(この1MBサイズの小さなエディタ)を追加し、イメージのサイズは530MBに上昇しました。その上にGitを追加して(30数MB)、イメージのサイズは830MBに急上昇したんだ。
正気の沙汰とは思えませんね。
コンテナのエクスポートとインポートを試して、履歴/中間画像を削除しています。この作業で25MBまで節約できましたが、現在、私の画像サイズは804MBです。また、1つのコンテナで多くのコマンドを実行することも試みました。
RUN
が、やはり最初の830MBと同じになってしまいました。
Dockerを使う価値があるのかどうか、疑問があります。つまり、ほとんど何もインストールしてないのに、1GBオーバーしているんです。もし、データベースなどの重大なものを追加することになれば、ディスク容量が足りなくなる可能性があります。
画像のサイズがとんでもなく大きいことに悩んでいる方はいらっしゃいますか?どのように対処していますか?
私のDockerfileが恐ろしく正しくないのでなければ?
FROM fedora:latest
MAINTAINER Me NotYou <[email protected]>
RUN yum -y install nano
RUN yum -y install git
が、ここで何が問題なのか、想像がつきません。
どのように解決するのか?
rexposadas が言ったように、イメージはすべてのレイヤーを含み、各レイヤーはあなたがインストールしたものに対するすべての依存関係を含みます。また、ベースとなるイメージ(例えば
fedora:latest
は非常に素っ気ないものになりがちです。インストールしたソフトウェアが持っている依存関係の数に驚くかもしれません。
を追加することで、インストールを大幅に小さくすることができました。
yum -y clean all
を各行に追加してください。
FROM fedora:latest
RUN yum -y install nano && yum -y clean all
RUN yum -y install git && yum -y clean all
各RUNについて、レイヤーがコミットされる前にそれを行うことが重要です。さもないと、削除しても実際にはデータは削除されません。そうしないと、削除しても実際にデータは削除されません。つまり、ユニオン/コピーオンライトファイルシステムでは、実際のデータはすでに下位レイヤーにコミットされているため、最後にクリーニングしてもファイルシステムの使用量はあまり減りません。これを回避するためには、各レイヤーでクリーニングを行う必要があります。
$ docker history bf5260c6651d
IMAGE CREATED CREATED BY SIZE
bf5260c6651d 4 days ago /bin/sh -c yum -y install git; yum -y clean a 260.7 MB
172743bd5d60 4 days ago /bin/sh -c yum -y install nano; yum -y clean 12.39 MB
3f2fed40e4b0 2 weeks ago /bin/sh -c #(nop) ADD file:cee1a4fcfcd00d18da 372.7 MB
fd241224e9cf 2 weeks ago /bin/sh -c #(nop) MAINTAINER Lokesh Mandvekar 0 B
511136ea3c5a 12 months ago 0 B
関連
-
[解決済み] Dockerコンテナの中から、マシンのローカルホストに接続するにはどうすればよいですか?
-
[解決済み] Docker Dockerコンテナからホストへのファイルコピー
-
[解決済み] ホストからDockerコンテナにファイルをコピーする方法は?
-
[解決済み] リポジトリを使用せずに、あるホストから別のホストにDockerイメージをコピーする方法
-
[解決済み] ホストからDockerコンテナのIPアドレスを取得する方法
-
[解決済み] Dockerコンテナのシェルに入るにはどうしたらいいですか?
-
[解決済み] 古いDockerコンテナを削除する方法
-
[解決済み] Dockerイメージはホストマシン上のどこに保存されていますか?
-
[解決済み】Dockerは仮想マシンとどう違うの?
-
[解決済み】base-imagesが更新された場合、Dockerコンテナを自動的に更新する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] dockerコンテナ間でメモリを共有することは可能ですか?
-
[解決済み] Dockerデーモンが動作していない
-
[解決済み] dockerでビルド中に環境変数を設定する方法
-
[解決済み] 不明な機関によって署名された "docker pull "証明書
-
[解決済み] dockerfileでローカルイメージをベースイメージとして使用するにはどうすればよいですか?
-
[解決済み】Dockerfileにイメージ名を設定する方法は?
-
[解決済み】Dockerfileで環境変数の値を取得する
-
[解決済み】Dockerfileの複数RUNと1つの連鎖RUN、どっちがいい?
-
[解決済み】Dockerfileに引数を渡すには?
-
[解決済み】Dockerにボリュームを追加しても、サブフォルダを除外してしまう。