38
25

More than 5 years have passed since last update.

Dockerfileを楽に作りたい(imageから自動生成したい)

Last updated at Posted at 2019-05-29

この記事には修正版があります.そちらをご覧ください. -> https://qiita.com/RyodoTanaka/items/c7e4889a1b9383291799

2019.05.29時点で下記手順でうまく行かない事を確認しました...orz -> 修正しました(2019.05.30)

修正版を作りました.
https://qiita.com/RyodoTanaka/items/c7e4889a1b9383291799


表題のとおりです.
Dockerfileを楽に作りたいなぁと思った時,どうやりますか?
私は下のような手順で出来るといいなと思ってます.

  1. Docker image の実行
  2. 環境構築
  3. 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にイメージをアップしまくれますね!!!

38
25
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
25