いくつかの研究の後、私はテストごとに高速かつきれいな解決策を考え出しました。
総合的なソリューションはこれです:
- は、アーカイブディレクトリ名、シンボリックリンク名
docker export ...
- パイプを経由してtarアーカイブに
docker create ...
- 輸出を経由してそのファイルシステム全体をイメージするためのコンテナを作成し、 (例えば、MD5)
- 異なるイメージのハッシュを比較して、内容が等しいかどうかを確認する
これだけです。
次のように技術的には、これを行うことができます。
1)例えば、ファイルmd5docker
を作成し、それを実行権限を与えます、chmod +x md5docker
:
#!/bin/sh
dir=$(dirname "$0")
docker create $1 | { read cid; docker export $cid | $dir/tarcat | md5; docker rm $cid > /dev/null; }
2)は、ファイルtarcat
を作成し、それを実行権を与え、例えば、chmod +x tarcat
:
#!/usr/bin/env python3
# coding=utf-8
if __name__ == '__main__':
import sys
import tarfile
with tarfile.open(fileobj=sys.stdin.buffer, mode="r|*") as tar:
for tarinfo in tar:
if tarinfo.isfile():
print(tarinfo.name, flush=True)
with tar.extractfile(tarinfo) as file:
sys.stdout.buffer.write(file.read())
elif tarinfo.isdir():
print(tarinfo.name, flush=True)
elif tarinfo.issym() or tarinfo.islnk():
print(tarinfo.name, flush=True)
print(tarinfo.linkname, flush=True)
else:
print("\33[0;31mIGNORING:\33[0m ", tarinfo.name, file=sys.stderr)
3)今計算するために、<image>
があなたのイメージの名前またはIDです./md5docker <image>
を呼び出しますイメージのファイルシステム全体のMD5ハッシュ。
2つの画像の内容が同じかどうかを確認するには、手順3)で計算したハッシュ値と等しいかどうかを確認します。
このソリューションでは、コンテンツのディレクトリ構造、通常のファイルの内容、およびシンボリックリンク(ソフトとハード)のみを考慮しています。より多くの情報が必要な場合は、追加するコンテンツをテストするためにelif
句を追加して(Python's tarfileを参照して、必要なコンテンツに対応するメソッドTarInfo.isXXX()
を探して)tarcat
スクリプトを変更するだけです。
私がこのソリューションで見る唯一の制限はPythonへの依存です(私はPython3を使用していますが、Python2に適応するのは非常に簡単です)。どのような依存関係も持たない方がよい、おそらくもっと早い(おそらくこれは既に非常に高速です)。tarcat
スクリプトを静的リンクをサポートする言語で記述して、スタンドアロンの実行可能ファイル(つまり、しかし、唯一のOS)。私はこれをC、Rust、OCaml、Haskellの将来の演習として残しておきます。
MD5がニーズに合わない場合は、最初のスクリプト内のmd5
をハッシュユーティリティで置き換えてください。
これは誰でも読むのに役立ちます。
これは機能しません。私は、同じ名前の2つのイメージのビルドの間に1つのファイルをタッチし、異なるsha256を取得しました。 – mljrg
あなたがファイルに触れた場合、これは異なるハッシュにつながる変更につながります。@@@@ – Marged