38
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Dockerfileを楽に作りたい(imageから自動生成したい) [修正版]

Last updated at Posted at 2019-05-30

はじめに

以前,下記の記事を書きました.
https://qiita.com/RyodoTanaka/items/6f8da0749cbd0afa0ddd

が,うまく行かないことがわかり修正版を作りました.
修正と言っても,もはや作り変えです.

やりたいこと

Dockerfileを楽に作りたいなぁと思った時,どうやりますか?
Dockerfileを任意のimageから自動生成できたら嬉しいですよね!
私は下のような手順で出来るといいなと思ってます.

  1. Docker image の実行
  2. 環境構築
  3. 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とかされながらちゃんと動作するように手直ししてください.

まとめ

というわけで,ようやくそれっぽいものができました.
色々不完全なので,皆様のご指摘をいただけると嬉しいです!!

38
35
0

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
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?