はじめに
現状はCodeBuildの標準イメージではopenJDK13をサポートしていない様子。
そのためopenJDK13対応のカスタムイメージを作成しCodeBuildでビルドに利用出来るようにしてみました。
作成したイメージはCodebuildで参照するためECRにPUSHします。
前提条件&注意点
- 今回openjdk13がtestingリポジトリでしか公開されていないため利用しています。ご注意ください。
- aws cliのバージョンが古いと
get-login-password
が使えずエラーになる可能性があります。 - ECRリポジトリの事前に作成しておいてください。
- 既にdockerイメージがbuild出来る環境がある想定です。
- 利用する環境はECRへのアクセス権限を持つ必要があります。
参考:Amazon Elastic Container Registry アイデンティティベースのポリシーの例
Dockerfile作成
今回はdocker:dind
ベースで作成していきます。alpine
ベースなのでapkで必要なコマンド等を追加していきます。
少し汎用性も考慮して最終的には以下のようになりました。
tzdata
はCodeBuildでビルドログを見る際に時刻を合わせるために入れています。
前述のように以下、testingのリポジトリを指定してopenjdk13をaddしています。
FROM docker:dind
RUN apk update \
&& apk --no-cache add tzdata \
&& cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
&& apk del tzdata \
&& apk --no-cache add curl git maven py-pip python\
&& apk --no-cache add openjdk13 --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing \
&& pip install awscli \
&& apk del --purge py-pip
ベースのDockerイメージをビルド&ECRにpush
ECRにイメージをPUSHするので、先にAWSマネジメントコンソールより対象のECRリポジトリを開き「プッシュコマンドの表示」を確認しておきます。
ECRの認証トークンを取得して、PUSH準備
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin [AWSアカウントID].dkr.ecr.ap-northeast-1.amazonaws.com/[ECRリポジトリ名]
dockerイメージをbuild
docker build -t [AWSアカウントID].dkr.ecr.ap-northeast-1.amazonaws.com/[ECRリポジトリ名]:[イメージタグ] .
ECRにイメージをPUSH
docker push [AWSアカウントID].dkr.ecr.ap-northeast-1.amazonaws.com/[ECRリポジトリ名]:[イメージタグ]
確認&CodeBuildで動かす際のサンプル
ECRにイメージがPUSHされていることを確認したら完了です。
CodeBuildで使う場合のbuildspec.yml
サンプルを下記を記載します。
alpineベースの場合timeout
に-t
オプションを付けるとAWS公式ドキュメントに書いてありますが、
作成したイメージをrunして試したところ-t
オプションがあるとエラーになるため外しました。
buildspec.yml
version: 0.2
phases:
install:
commands:
- nohup /usr/local/bin/dockerd --host=unix:///var/run/docker.sock --host=tcp://127.0.0.1:2375 --storage-driver=overlay2&
- timeout 15 sh -c "until docker info; do echo .; sleep 1; done"
pre_build:
commands:
~以下省略~
ローカルで動かす際の注意点
作成したDockerImageをローカルで動作確認する際はprivileged: true
にしないと動作しないので注意。
自分はdocker-compose.ymlに下記のように書いてdocker-compose up
で確認しています。
(Dockerimageはdocker-dind-testでbuild済み)
version: '2'
services:
docker-dind:
image: docker-dind-test:latest
privileged: true