JenkinsでDockerコンテナを起動していると、ビルド失敗やDockerfileの編集で不要になったコンテナやイメージがたまってくることがあります。
Dockerコンテナ起動失敗の原因になることもあるので、適度に掃除しながら実行させる方法を紹介します。
やりたいこと
- Job(ワークスペース)ごとにコンテナを生成する
- イメージは使いまわす
- 使わなくなったコンテナやイメージは削除する
対象環境
- Docker: (Macでvolumeオプションを使う場合)1.3以降
- Jenkins: 1.458以降
Jenkinsで使用するプラグイン
-
Managed Script Plugin
- Jobごとに生成するコンテナのタグ付けルールがバラバラだと競合する可能性があります。
- そこで、スクリプトを共通化するプラグインを用いて、規則化されたタグ付けを行うようにします。
スクリプト作成
登録方法
- 「Jenkinsの管理」>「Managed files」>「Add a new Config」
- 「Managed script file」を選択
スクリプト
- 「Name」は適当な名前をつける
- 「Argument list」を登録
- docker_build_tag(ビルドタグ)
- docker_run_command(Dockerコンテナ上で実行するコマンド)
- dockerfile_dir(Dockerfileをおいたディレクトリ)
- 実行ユーザーやポート指定が必要な方は適宜追加してください。
- 「Content」に以下のスクリプトを追加
# ビルドパラメータ
docker_build_tag=$1
docker_run_command=$2
dockerfile_dir=$3
# Docker初期設定
boot2docker init
boot2docker up
# Docker環境変数
export DOCKER_HOST=tcp://$(boot2docker ip 2>/dev/null):2376
export DOCKER_CERT_PATH=~/.boot2docker/certs/boot2docker-vm
export DOCKER_TLS_VERIFY=1
# 未起動コンテナの削除
for container_id in $(docker ps -a -q -f status=exited); do
docker rm ${container_id}
done
# 不要イメージの削除
for image_id in $(docker images | awk '/^<none>/ { print $3 }'); do
docker rmi ${image_id}
done
# イメージ作成
docker build -t ${docker_build_tag}:1.0 ${dockerfile_dir}
# コンテナ上でworkspaceをビルド
docker run -it \
-v ${WORKSPACE}:/workspace \
-w /workspace \
--name ${JOB_NAME} \
$(docker images | grep ${docker_build_tag} | awk '{ print $3 }') \
/bin/sh -c "${docker_run_command}"
# 今回のJobで作成したコンテナの削除
# docker runに"--rm=true"オプションをつければ同等のことはできるが、ビルド失敗した際は解析できるように外している
for container_id in $(docker ps -a -f status=exited | awk '/'${JOB_NAME}'/ { print $1 }'); do
docker rm ${container_id}
done