PackerでDocker Imageを作る時に知ったこと

最近はAWSのAMIやECSでコンテナたてる時に使うDocker ImageをPackerで作成している @hatappiです
Packerを使うとAMIにしてもDocker Imageにしても自分の好きなプロビジョニングを使用することが出来るので好きです

今回は例えば元となるdocker imageにはrbenv/rbenvがインストールされており
.bashrcなり/etc/profile.d/rbenv.shなりに下記のようにPATHが定義されているものがあるとします

このImageをPackerで使ってbundle installしたイメージを作るとする

bundle.manifest.json

これを単純に実行してしまうと bundle: command not found というエラーで起きてしまう
これは単にパスが通ってないだけなので下記のようにsourceでPATHが定義されたものを読みこんであげれば解決する

ここからが本題でこれの別解としてPackerのオプションを利用していく

まず

を行うとPackerではどうなるかというとまずコンテナ上に/tmp/script_6464.shのような一時ファイルを作成します
中身としては

となっておりこれをPacker側で下記のようにdocker execを使って実行している

ここまでくるとなんとなく見えてくる
一時ファイルとして作成されたシェルファイルの1行目のshebangを変更してあげれば良い
type: “shell”のドキュメントを見るとinline_shebangというそれらしいオプションがある!!
これを使って

こんな感じで書いてあげる
-lを追加することでログインしたときのようにbashで実行することが出来るのでPATHなども読み込まれた状態で実行することが出来る

どちらを使っても実現は出来たがPackerの挙動が知れたので良かったとします

投稿日:May 18th 2017

元記事:http://hatappi.hateblo.jp/entry/2017/05/18/214949

– PR –
– PR –