docker diffコマンドの使い方(実例で解説)

docker diffコマンド解説

 本記事はDocker ver24.0.7の環境で確認しています。

 このコマンドは、コンテナを作成した時点とdocker diffコマンドを実行した時点のコンテナ内のファイルやディレクトリを比較して、変更状況を確認することができます。

 一覧はファイル/ディレクトリ単位で、それぞれに対して追加/削除/変更の3つの事象のどれが発生したのかについて確認することが可能です。

docker diffコマンドのフォーマットとオプション

フォーマット

docker diff [オプション] 確認対象コンテナ

主なオプション一覧

オプション概説
なし

コマンド例

$ docker diff testvm

docker diffコマンドの主な使い方

 以下で実例をまじえたコマンドの使い方を解説していきたいと思います。

実例では、Ubuntuの公式イメージにより起動したコンテナ(testvm)を使用します。

コンテナは「docker run -dit --init --name testvm ubuntu」で起動します。

※「--rm」オプションを付けておりませんので、ご利用後はコンテナ削除をお忘れなく。

基本事項の解説

 冒頭でふれましたとおり、コンテナ作成時点とdocker diffコマンドを実行した時点のファイルシステム内のファイルやディレクトリの差分情報が出力されます。

 例えば、コンテナ作成時点には存在しなかったファイルが見つかった場合は「A」フラグ付きで出力されますし、コンテナ作成時点には存在していたディレクトリが見つからなかった場合は「D」フラグ付きで出力されます。

 以下で具体的に見ていきましょう。

コンテナ内のファイルシステム上で発生した変更の一覧を表示する

 docker diffコマンドは、コンテナ内で発生したファイルやディレクトリの変更の一覧を表示することができます。

 コマンドを実行しますと、コンテナの作成時点のファイルシステムイメージと、コマンドを実行した時点のファイルシステムイメージを比較して、変更があったものに対して、その種別(追加(=A)、変更(=C)、削除(=D))が表示されます。

 コマンドは以下のように実行します。

$ docker diff testvm

 例えば、以下のような内容が出力されます。

C /root
A /root/.bash_history
C /etc
C /etc/shadow
A /test
A /test/dir01
A /test/file001.txt
D /mnt

 各行の左端の文字は、種別(追加(=A)、変更(=C)、削除(=D))を示しています。

 上記の出力例でわかることは、以下のとおりです。

  • コンテナtestvm作成時点では無かったが、現在は/test/file001.txtと/root/.bash_historyのファイルが存在する。
  • コンテナtestvm作成時点では無かったが、現在は/testと/test/dir01ディレクトリが存在する。
  • コンテナtestvm作成時点と現在で、/etcと/rootディレクトリの内容、属性情報などで相違点がある。
  • コンテナtestvm作成時点と現在で、/etc/shadowファイルの内容、属性情報などで相違点がある。
  • コンテナtestvm作成時点では存在していた/mntが、現在は存在しない。

 この例のように、コンテナ作成時点から、コンテナに対してどのような変更が行われたかを把握することが出来ます。

 ところで、「A /test」の部分は、「/testディレクトリが新規作成された」でも間違いではありません。

 しかしdocker diffコマンドは、新規作成されたディレクトリが全て出力されるのではありません。

 コンテナ作成後、新規に作成されたディレクトリが、その後削除された場合、そのあとdocker diffコマンドを実行しても、新規作成されたディレクトリは表示されません。

 unixのdiffコマンドをご存知の方はご理解いただけると思いますが、docker diffコマンドは、コンテナ作成時点の内容を比較対象として差分を出力するコマンドであり、更新履歴を出力するコマンドではありません。

コンテナ内の変更が表示されない場合の例

 コンテナ内でファイルやディレクトリに対して変更を行っても、docker diff コマンドで出力されない場合の例を2つほど示します。

新規作成した後に削除

 1つめは、ディレクトリを新規作成した後、そのディレクトリを削除した場合です。

 コンテナtestvm内で、以下のコマンドを実行します。

# mkdir test02
# rm -r test02
rm: remove directory 'test02'? y
#

 test02ディレクトリを作成して、削除しました。

 コンテナ外のdockerホスト上にて、docker diffコマンドを実行しますと、以下の内容が表示されます。

A /test
A /test/dir01
A /test/file001.txt
C /root
A /root/.bash_history
C /etc
C /etc/shadow
D /mnt

 test02ディレクトリの内容は出力されていません。

新規作成後に更新

 2つめは、ファイルを新規作成後、そのファイルの内容を更新した場合です。

 コンテナtestvm内で、ファイルを新規作成します。

# touch test002.txt

 コンテナ外のdockerホスト上にて、docker diffコマンドを実行しますと、以下の内容が表示されました。

A /test002.txt

 次に、コンテナtestvm内で、test002.txtファイルを更新します。

# echo aaa > test002.txt

※ubuntuのDockerイメージには初期状態ではviコマンドがありませんので、リダイレクトを使ってtest002.txtに文字を書き込みました

 しかし、コンテナ外のdockerホスト上にて、docker diffコマンドを実行しても、以下の内容しか表示されません。

A /test002.txt

 コンテナを作成し、起動後、そのコンテナ内でファイルを新規に作成して、その後ファイルの内容を更新した場合、docker diffで出力されるのは、ファイルが新規に作成されたことを示す「A」の行だけになります。「C」の行は表示されません。

 ファイルを作成し、内容を更新したとしても、コンテナ作成時点から見れば、そのファイルは存在しないので、ファイルを更新したことは検知出来ません。

 ファイルの更新が検知できるのは、コンテナ作成時点にコンテナ内に存在していたファイルのみです。

おわりに

  以上でdocker diffコマンドの紹介を終わります。

 ご指摘、ご要望などが御座いましたらコメントいただけるとうれしいです。

 他のDockerコマンドの実例付紹介記事は、本サイト内の別記事「Dockerのコマンドの一覧(オリジナルな実例付き)」をご参照ください。

 ご訪問ありがとうございました!

コメント