はじめに
以前,下記の記事を書きました.
https://qiita.com/RyodoTanaka/items/6f8da0749cbd0afa0ddd
が,うまく行かないことがわかり修正版を作りました.
修正と言っても,もはや作り変えです.
やりたいこと
Dockerfileを楽に作りたいなぁと思った時,どうやりますか?
Dockerfileを任意のimageから自動生成できたら嬉しいですよね!
私は下のような手順で出来るといいなと思ってます.
- Docker image の実行
- 環境構築
- imageからDockerfileを作成
というわけでその手順を記しておきます.
制約
後で仕組みの説明をしますが,下記のような制約があります.
- Bashじゃないとダメ
- コマンド総数が2000行を超える場合は,予め
.bash_history
の行数制限を解除する必要アリ - 環境構築時にエラーが出るようなコマンドを自動認識することは不可能
です.
ここに上げてる以外のこともあるかもしれません...
その場合は是非issue等を立ててください!
一緒に改善していきたいです!
仕組み
前回の記事ではdocker history
を使っていましたが,
これでは image にログインした後のコマンドは全く追えませんでした.
なので,bash_history
を使って環境構築部分を引っ張ってきてやろう!
で,引っ張ってきたやつを無理やりRUN
で全部回してやろう!
というのが仕組みです.
ホントそれだけです.
Dockerfileが出来るまでの流れ
1. Docker image の実行
例えば,Ubuntu 16.04
をベースにしたいなと思ったとき,まずはimageを引っ張ってきますよね.
$ docker pull <image repository name>
でもってPullが完了したら,そいつを実行します.
$ docker run -it <image name>
2. 環境構築
実行してるcontainer内で色々環境構築します.
具体的に何をするかは皆様お好きに!
環境構築が終わったらexit
コマンドとか使って終了します.
この時,予めコマンド数が増えそうだとわかっているなら,
bash_historyの保存制限を解除してください!!
やり方はこちらが参考になると思います.
https://stackoverflow.com/a/12234989
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を作成
本記事のミソです.
以前の投稿ではワンライナーで出来るとかどうとか言ってましたが,
そもそも仕組みが変わったんでスクリプトを書きました.
dfimage
というコマンドを使えるようにしてます.
スクリプトは下記リポジトリに置いてあります.
https://github.com/RyodoTanaka/.bash_extend/blob/master/dfimage.bash
こいつをで読み込んでやれば,
$ dfimage <image name>
とするだけで,Dockerfileを標準出力に出力してくれます.
なのでUNIX系使いの方であれば
$ dfimage <image name> > Dockerfile
とすれば自動でDockerfileが出来上がります!
.bashrc
とかで読み込むようにしておくと便利です.
5. 出来上がったDockerfileの手直し
最初の方にも書いたように,余分なコマンド等の認識はしていません.
(ただし,ls
コマンドだけは除外するようにしてます)
なので,ご自身でdocker build
とかされながらちゃんと動作するように手直ししてください.
まとめ
というわけで,ようやくそれっぽいものができました.
色々不完全なので,皆様のご指摘をいただけると嬉しいです!!