10

docker から特定のバージョンの (バイナリ) イメージを実行またはロールバックする方法に特に興味があり、この質問をその趣旨で明確にしようとしました。

Docker FAQには次のように書かれています。

Docker には、コンテナーの連続したバージョンを追跡し、バージョン間の差分を調べ、新しいバージョンをコミットし、ロールバックするなどの git のような機能が含まれています。履歴には、コンテナーがどのように誰によってアセンブルされたかも含まれているため、運用サーバーから完全なトレーサビリティが得られます。上流の開発者にまでさかのぼります。

Google のように、以前のコンテナーに「ロールバック」したり、相違点を調べたりする例を見つけることができません (明らかに、バージョン管理された Dockerfile に対してそのようなことを行うことができますが、Docker のバイナリ イメージ/コンテナーは、ソフトウェアソースが更新されているため、Dockerfile はそうではありません。私は、そのような変更を確認してロールバックする方法を探しています)。

基本的な例:私が走っていると想像してください

docker build -t myimage .

ベースのubuntuを更新するだけのDockerfileで:

FROM ubuntu:14:04
RUN apt-get update -q && apt-get upgrade -y

この同じイメージを数日後にビルドした場合、これらのイメージを比較して、どのパッケージがアップグレードされたかを確認するにはどうすればよいですか? 後で同じビルド コマンドを再実行した後、以前のバージョンのイメージに戻すにはどうすればよいですか?

4

2 に答える 2

12

技術的には、必ずしも履歴をロールバックするわけではなく、AUFS レイヤーをロールバックするだけです。ワークフローがコンテナーをインタラクティブに変更し、変更をコミットすることで構成されている場合、docker commitこれは、後のレイヤーで適用したパッケージの更新を削除し、以前のレイヤーにインストールされたバージョンを残すという意味で、実際には履歴をロールバックします。Dockerfile からイメージを再構築する場合、これは非常に異なります。次に、ビルドした以前のバージョンに戻すことはできません。Dockerfile からステップ (レイヤー) を削除することしかできません。docker commitつまり、 の履歴をイメージ にロールバックすることしかできません。

以前のバージョンの docker イメージにロールバックするための鍵は、docker タグを以前のハッシュに向けることにあるようです。

たとえばhistory、標準ubuntu:latestイメージの を調べることを検討してください。

docker history ubuntu:latest

ショー:

IMAGE               CREATED             CREATED BY                                      SIZE
ba5877dc9bec        3 weeks ago         /bin/sh -c #(nop) CMD [/bin/bash]               0 B
2318d26665ef        3 weeks ago         /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/   1.903 kB
ebc34468f71d        3 weeks ago         /bin/sh -c rm -rf /var/lib/apt/lists/*          8 B
25f11f5fb0cb        3 weeks ago         /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic   194.5 kB
9bad880da3d2        3 weeks ago         /bin/sh -c #(nop) ADD file:de2b0b2e36953c018c   192.5 MB
511136ea3c5a        14 months ago    

                                               0 B

hash で示される画像に戻りたいとします25f

docker tag 25f ubuntu:latest
docker history ubuntu:latest

そして、次のことがわかります。

IMAGE               CREATED             CREATED BY                                      SIZE
25f11f5fb0cb        3 weeks ago         /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic   194.5 kB
9bad880da3d2        3 weeks ago         /bin/sh -c #(nop) ADD file:de2b0b2e36953c018c   192.5 MB
511136ea3c5a        14 months ago                                                       0 B

もちろん、ubuntu:latestローカル ライブラリで実際には最新の ubuntu にはならないため、この方法でロールバックすることはおそらくありません。必要な任意のタグを使用できることに注意してください。

docker tag 25f ubuntu:notlatest

または単にハッシュによって古いイメージを起動しました:

docker run -it 25f /bin/bash

とてもシンプルでありながらとてもきれいです。これを と組み合わせてdocker inspect、Docker FAQ が参照する各イメージのメタデータについてもう少し詳細を取得できることに注意してください。

また、docker diffdocker commitはイメージを直接参照するのではなく、コンテナー (実行中のイメージなど) を参照するため、このプロセスとはあまり関係がないことに注意してください。つまり、イメージをインタラクティブに実行し、イメージにファイルを追加または変更すると、 を使用して (コンテナ間の) 変更を確認し、 を使用docker diff <Container-id>して変更をコミットできますdocker commit <Container id>

于 2014-08-18T19:36:27.993 に答える
0

実際にハッシュをタグとして使用できるかどうかはわかりません。ハッシュ IIRC は画像自体への参照ですが、タグは画像のメタデータ フィールドに近いものです。

タグ機能の私見は非常によく文書化されていませんが、おそらくそれを使用する方法は、ある種のセマンティック バージョニングを使用してタグと画像を整理することです。複雑な (12 個のマイクロサービス) システムを Docker を使用するように移行しており、依存しlatestていたものから、変更を追跡するためにセマンティック バージョニングや Git Repo での変更ログなどをすぐに実行することになりました。

dockerこれは、変更を自動的に受け取り、DockerHub でビルドをトリガーするブランチがあると言う場合にも役立ちます。変更ログを更新して、どのハッシュ/タイムスタンプが何と一致するかを知ることができます。

個人的には、現時点では DockerHub のビルド トリガーが遅いため、各イメージのタグを手動で宣言し、変更ログを保持することを好みますが、YMMV と私はツールがこの点で改善されると考えています。

于 2014-08-16T11:28:18.863 に答える