docker diffコマンドの使い方(実例付)CE対応


 docker diffコマンドの使い方の紹介ページです。Docker CE ver17.12.1に対応しております。

 このコマンドは、コンテナを作成した時点とdocker diffコマンドを実行した時点のコンテナ内のファイルシステムの内容を比較して、ファイルやディレクトリ毎の変更種別を確認することが出来ます。

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

 それでは以下で詳細に解説いたします。

 

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

フォーマット

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

 

主なオプション一覧

特になし

■ 本記事の目次に戻る ■

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

 以下の実例は、CentOSの公式イメージにより起動したコンテナ(testvm)を使用します。コンテナは「docker run -d --name testvm centos init」で起動します。

 

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

 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ディレクトリの内容は出力されていません。

(先ほどdocker diffコマンドを実行した時と、各行の出力の順番が異なってますが、内容は変わってません。なぜ出力順番が変わったかは不明です。ご存知の方がいらっしゃいましたらコメントいただけるとありがたいです)

 

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

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

# touch test002.txt

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

A /test002.txt

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

# vi test002.txt

 viコマンドで、test002.txtに適当に文字を書き込みました。

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

A /test002.txt

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

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

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

 

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

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

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

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


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です