Dockerの6つのtips

1. イメージを作る方法はDockerfileだけじゃない

Packerもある。

Packer by HashiCorp

Packerは様々な仮想環境のイメージを統一的な方法で作れるツールで、VirtualboxAWS・DigitalOceanなどにも対応しています。 したがって、DigitalOceanイメージとDockerイメージを1つのソースから作るといったことができます。

PackerはDockerの全機能が使えるわけではない(差分ビルドができない)のですが、 場合によっては問題にならないかもしれません。

2.Dockerイメージはtarで保存できる

Dockerイメージをtarとして保存すれば、Jenkinsの成果物として保存したり、S3経由で配信したりできます。

tar出力するにはdocker exportを使います。また、packerはデフォルトではイメージをtarで出力します。

3. 出力ファイルをchownする

docker run-v を付けると、コンテナにホストのディレクトリをマウントできます。

ところで、一般ユーザーがdocker runを実行しても、コンテナ内部ではrootユーザーとしてコマンドが実行されているため、出力ファイルもオーナー= rootで作られます。 このとき、ホスト側のディレクトリでもファイルのオーナーがrootになってしまうため、ファイルにアクセスできなくなってしまいます。

環境変数としてユーザー名を渡し、出力ファイルのオーナーを変更するとよいと思います。

docker-test.sh

#!/bin/bash
go test -v ./... | tee /docker/output/gotest.log
EXIT_CODE=$?

useradd "${OUTPUT_USER}"
chown "${OUTPUT_USER}:${OUTPUT_USER}" /docker/output/gotest.log

exit ${EXIT_CODE}
docker run \
  --env=OUTPUT_USER="${USER}" \
   -v "/workspace:/docker" \
  centos \
  docker-test.sh

4. --rmでコンテナを削除する

普通にdocker runするとコマンド終了後もコンテナが残り、いずれこのコンテナが溜まってディスクが溢れてしまいます。

docker run--rmをつけると、コマンド成功時には自動でコンテナを削除します。

5. cidfileで失敗時にもコンテナを削除する

docker runはコマンドが失敗したときにはコンテナを終了しません。 そのため、--rmをつけていてもコンテナが残ってしまいます。

docker run--cidfile=<file>をつけるとにコンテナのIDを出力するので、後からdocker stopします。

docker run --rm --cidfile=dockercid centos /bin/false

if [ -e dockercid ]; then
  CID=$(cat dockercid | cut -b -12)
  (docker ps -aq | grep "${CID}") && docker stop "${CID}"
  rm -f dockercid
fi

6. 古いコンテナ・イメージを削除する

さらに定期的に以下のコマンドを実行すれば、さらに安心です。

for cid in $(docker ps -aq); do
  docker rm "${cid}"
done

for iid in $(docker images | awk '/^<none>/ { print $3 }'); do
  docker rmi "${iid}"
done

まとめ

DockerはWordのイルカより有能です。