Ubuntu をベースに Ruby 2.3.1 + chef(knife-zero) + openssh-server が入っている Docker イメージを作ってみた。例によって、sshd を走らせると、root のパスワードも公開鍵もなしでログインできる。
注意
これは、Chef 動作チェック専用のイメージであって、実運用を念頭に置いていない。セキュリティ関係の処理が簡略化されていることに注意すること。
準備するファイル
FROM ubuntu:trusty
ENV PATH /usr/local/rvm/bin:$PATH
RUN export DEBIAN_FRONTEND=noninteractive \
&& gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 \
&& apt-get update \
&& apt-get install -y curl \
&& \curl -L https://get.rvm.io | bash -s stable \
&& rvm install 2.3.1 \
&& bash --login -c 'rvm use 2.3.1 --default' \
&& echo "install: --no-document\nupdate: --no-document" > /etc/gemrc \
&& bash --login -c 'gem install bundler chef knife-zero berkshelf' \
&& apt-get install -y openssh-server \
&& passwd -d root
COPY sshd_config /etc/ssh/sshd_config
CMD ["bash", "--login"]
PermitEmptyPasswords yes
PasswordAuthentication yes
UsePAM no
Subsystem sftp /usr/lib/openssh/sftp-server
イメージ作成
$ ls
Dockerfile sshd_config
$ docker build -t ubuntu_chef .
コンテナ実行
$ docker run -it ubuntu_chef
# service ssh start
# ifconfig eth0
=> IP アドレスを取得(例:173.17.0.2)
雑感
Dockerfile の作り方も若干慣れてきた。
次から sshd_config も Dockerfile に組み込んでしまおうかな?
ファイル一つで Docker イメージが作れるのは気持ちいいよね。
RUN コマンドの中で && を使うのは、必須なんだろうか?
レイヤーを減らして、最終的なイメージを小さくするのに役立つらしい。
ただ、実際ちょっと RUN を多用して同じイメージを作ってみたけど、そんなにイメージサイズは変わらなかったなあ(数%大きい程度)。Docker hub の Dockerfile はだいたい、RUN を一つにまとめているから、私もそれに倣ってこうしているわけだけど。
実は、knife-zero のクライアント側(構成管理される側)は sshd だけが条件で、Ruby はあらかじめインストールされている必要はないし、chef のワークステーション側(構成管理する側)は、ssh のクライアントだけあれば十分なはずなので、上の Docker イメージはちょっと冗長ではあるのだが。
sftp server は必要かどうかわからないがいちおう組み込んでみた。
後日談
あとで気がついたのだが、本家から Chef Development Kit(ChefDK) を落として使うのが今風らしい。あとで Docker イメージを作りなおすかも。ただ "Hello World!" する程度なら現状でも十分な気がする。