この記事には修正版があります.そちらをご覧ください. -> https://qiita.com/RyodoTanaka/items/c7e4889a1b9383291799
2019.05.29時点で下記手順でうまく行かない事を確認しました...orz -> 修正しました(2019.05.30)
修正版を作りました.
https://qiita.com/RyodoTanaka/items/c7e4889a1b9383291799
表題のとおりです.
Dockerfileを楽に作りたいなぁと思った時,どうやりますか?
私は下のような手順で出来るといいなと思ってます.
- Docker image の実行
- 環境構築
- imageからDockerfileを作成
1. Docker image の実行
例えば,Ubuntu 16.04
をベースにしたいなと思ったとき,まずはimageを引っ張ってきますよね.
$ docker pull <image repository name>
でもってPullが完了したら,そいつを実行します.
$ docker run -it <image name>
2. 環境構築
実行してるcontainer内で色々環境構築します.
具体的に何をするかは皆様お好きに!
環境構築が終わったらexit
コマンドとか使って終了します.
3. containerからimageを作成する
まずはcontainer 情報を下記コマンドで確認します.
ここからDockerfileを作りたいcontainer IDか名前を取得します.
$ docker ps -a
そしたら,下記コマンドで希望のcontainerを任意の名前のimageにします.
$ docker container commit <container ID> <image name>
一応作成し終わったら,下記コマンドでimageがちゃんと作られてるか確認します.
$ docker images
4. imageからDockerfileを作成
はい.やっと本記事のミソですね.
適当にぐぐったところ,海外の方が神bashをアップしてくださってました.
やっぱりStack Overflow なしでは生きていけません.
https://stackoverflow.com/a/50926503
$ docker history --no-trunc <image name> | tac | tr -s ' ' | cut -d " " -f 5- | sed 's,^/bin/sh -c #(nop) ,,g' | sed 's,^/bin/sh -c,RUN,g' | sed 's, && ,\n & ,g' | sed 's,\s*[0-9]*[\.]*[0-9]*[kMG]*B\s*$,,g' | head -n -1
ただ,こいつ長いですよね.
なので,dfimage
というコマンドを作りました.
https://github.com/RyodoTanaka/.bash_extend/blob/master/dfimage.bash
こいつを.bashrc
で読み込んでやれば,
$ dfimage <image name>
とするだけで,Dockerfileを標準出力に出力してくれます.
なのでUNIX系使いの方であれば
$ dfimage <image name> > Dockerfile
とすれば自動でDockerfileが出来上がります!
まとめ
というわけで,dfimage
コマンドを作って簡単にDockerfileが作成できるようにしました.
これでDocker Hubにイメージをアップしまくれますね!!!