undockerでdocker imageの中身を確認する
最近、同僚の @r_takaishi からの非常にありがたいPull Requestもあって、sshcの整備を行なっています。
そのときに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の中身を比べてみました。
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が通るようになっています。