undockerでdocker imageの中身を確認する

最近、同僚の @r_takaishi からの非常にありがたいPull Requestもあって、sshcの整備を行なっています。

github.com

そのときにDockerを利用してSSH接続のインテグレーションテスト環境を(ほぼ @r_takaishi が)作りました。

そして紆余曲折あって、https://hub.docker.com/r/panubo/sshd/ を使わせてもらうことに。

そして、sudoのテストを作りたくなったのですが、そのままでは設定が足りなかったので、docker run -d したpanubo/sshdのに docker exec で入って設定を調整をしてsudoのテストが書けるようになったところで、

panubo/sshdのイメージの元となっている https://github.com/panubo/docker-sshd に試した設定を追加をして docker build でイメージを作成してインテグレーションテストに利用してみました。

ところがうまくいかない

なぜかsudoに失敗するのです。

いろいろ検証して時間を溶かした結果、Docker Hubに上がっているイメージとGitHubのDockerfileに乖離がある」疑惑がでてきました。

docker imageの中身を確認する

というわけでこれまた同僚である @_tokibi が作っている undocker を使ってimageの中身を比べてみました。

github.com

tokibi/undockerは、簡単にいうとDocker imageからrootfsを取り出したり、Docker imageのメタデータを表示したりするCLIツールです。Docker imageの中身をいろいろするやつということですね。

そしてGoのライブラリとして組み込むこともできるようになっています。

今回は展開する機能を利用します。

undockerをインストール

まずはundockerをインストール

$ brew install tokibi/tap/undocker

GitHubのDockerfileのほうはbuildします

$ cd src/github.com/panubo/docker-sshd
$ docker build . -t github-image

undocker extract

次に undocker でそれぞれのrootfsを展開します

$ undocker extract panubo/sshd ./hub
$ undocker extract github-image ./github

あとはdiffで比較するだけ

$ diff -r ./hub ./github
diff -r ./hub/etc/alpine-release ./github/etc/alpine-release
1c1
< 3.6.3
---
> 3.6.5
diff -r ./hub/etc/apk/world ./github/etc/apk/world
5a6
> busybox
Only in ./hub/etc: localtime
diff -r ./hub/etc/os-release ./github/etc/os-release
3c3
< VERSION_ID=3.6.3 👈🤔
---
> VERSION_ID=3.6.5
diff -r ./hub/etc/shadow ./github/etc/shadow
1c1
< root:::0:::::
---
> root:!::0::::: 👈🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔
diff -r ./hub/etc/shadow- ./github/etc/shadow-
1c1
< root:::0:::::
---
> root:!::0:::::
diff -r ./hub/lib/apk/db/installed ./github/lib/apk/db/installed
1c1
< C:Q15chWm9+bJw8UDs+H5aW3Jw56BIg=
[...]

結論としてはrootがロックされていたことが原因でした。なんでだ??


forkして修正したDockerfileはこちら。パスワード付きsudoが通るようになっています。

github.com