Posted at

Dockerfileを既存のDockerイメージから生成する方法


既存のDockerイメージを再構築したい

Dockerイメージは取得できるけどDockerfileがないなーという場合に役立つ


Docker historyコマンド

Dockerイメージの履歴を確認するコマンド

この履歴こそがDockerfileで実行されるコマンドに相当する。

Docker Documentation

https://docs.docker.com/engine/reference/commandline/history/


Docker history 実行結果


例として、centos7のDockerイメージの履歴を見てみる

$docker history centos:7 

IMAGE CREATED CREATED BY SIZE COMMENT
5182e96772bf 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 2 months ago /bin/sh -c #(nop) ADD file:6340c690b08865d7e… 200MB

コマンドが一部省略されてしまう


省略せずに表示してみる

$docker history centos:7 --no-trunc

IMAGE CREATED CREATED BY SIZE COMMENT
sha256:5182e96772bf11f4b912658e265dfe0db8bd314475443b6434ea708784192892 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 2 months ago /bin/sh -c #(nop) LABEL org.label-schema.schema-version=1.0 org.label-schema.name=CentOS Base Image org.label-schema.vendor=CentOS org.label-schema.license=GPLv2 org.label-schema.build-date=20180804 0B
<missing> 2 months ago /bin/sh -c #(nop) ADD file:6340c690b08865d7eb84a36050a0ab0e8effc2b010a4ccb20b810153a97a9228 in / 200MB

どうしたらこんなにきたなくひょうじできるんだ...


整形して見やすく表示

formatオプションにより、コマンド部分のみを抽出

$docker history centos:7 --no-trunc --format '{{ json .CreatedBy }}' 

"/bin/sh -c #(nop) CMD [\"/bin/bash\"]"
"/bin/sh -c #(nop) LABEL org.label-schema.schema-version=1.0 org.label-schema.name=CentOS Base Image org.label-schema.vendor=CentOS org.label-schema.license=GPLv2 org.label-schema.build-date=20180804"
"/bin/sh -c #(nop) ADD file:6340c690b08865d7eb84a36050a0ab0e8effc2b010a4ccb20b810153a97a9228 in / "


履歴の新しい方から表示されるためDockerfileとして扱うには逆順にしてあげる必要がある

$docker history centos:7 --no-trunc --format '{{ json .CreatedBy }}' | tail -r

"/bin/sh -c #(nop) ADD file:6340c690b08865d7eb84a36050a0ab0e8effc2b010a4ccb20b810153a97a9228 in / "
"/bin/sh -c #(nop) LABEL org.label-schema.schema-version=1.0 org.label-schema.name=CentOS Base Image org.label-schema.vendor=CentOS org.label-schema.license=GPLv2 org.label-schema.build-date=20180804"
"/bin/sh -c #(nop) CMD [\"/bin/bash\"]"


まとめ

ADDコマンドなどは、何やらファイルのIDなどを指すように置き換えられているため

そのまま流用できないが、参考にする程度のことはできると思う

ファイルなどもでてきたら嬉しいのだけど...