Dockerとchefで環境を作成

Dockerのイメージを作成する際にはDockerfileってのを書いてimageをbuildするんですが、chefに慣れた身にはちょいと機能的に不満。多分ちゃんと調べればいろいろできるんでしょうが。

そこでDockerfile中でchefが書けないものが調べてみると、やはり同じようんことを考える人はいるもんで、このページを発見。いろいろゴチャゴチャやってみてとりあえず目鼻が付きそうなので自分宛てにメモ。

proxy対応のイメージを作成

いまからコンテナを作成する環境では外部へのhttp,https通信はproxy経由でやらないといけません。そこでyum,curl,wgetそれぞれに対してproxyを参照する設定がはいったイメージを作成します。
まずcentos/latestのイメージをpullして、bashで対応するimageをrun。

# docker pull centos:latest
# docker run -it centos:latest /bin/bash
(.wgetrcとか.curlrcとかyum.confを編集)
# docker commit <container-id> hoge/centos:proxy

できたかどうかチェック。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
hoge/centos         proxy               c94e9d000edf        10 minutes ago      172.2 MB
centos              latest              7322fbe74aa5        8 weeks ago         172.2 MB

chef環境を用意

chefをインストール。でもって、いままで使っていたchefの環境をコピーします。

# mkdir dockerfile
# rcp -pr ~hoge/mypc/chef .

node.jsを用意

作成するコンテナ用にnodeファイルを上記で作成したchef環境以下へ作成します。上記の例で言うと dockerfile/chef/node 以下へ docker.js をこんな風に作成。

}
"run_list": [
  "recipe[postgresql]"
  ]
}

Dockerfileを用意

いまから環境構築する機器はプロクシ経由じゃないと外部へhttp,https接続できません。そのあたりの環境変数設定と、作成するコンテナへのchefのインストールを記述。一番最後にchefを起動する一文を書きます。

FROM hoge/centos:proxy
MAINTAINER hoge <hoge@example.com>
ENV HTTP_PROXY=http://proxy.example.com:8080/
ENV HTTPS_PROXY=http://proxy.example.com:8080/
ENV CHEFHOME /chef-solo
ADD chef-solo /chef-solo
RUN curl -L http://www.opscode.com/chef/install.sh | bash
RUN cd ${CHEFHOME} && chef-solo -c ${CHEFHOME}/solo.rb -j ${CHEFHOME}/nodes/docker.json

buildする

docker buildでイメージを作成。

# docker build -t hoge/centos:postgresql .
(後略)


実際にはいままで使っていたレシピからいろいろ変更すべきところがありました。そのあたりはおいおい。
とりあえずこれでchefでもってdockerイメージが作成できることがわかりました。ありがたい。