はじめに
前回は、上記の記事でイメージストリームの概念を理解しました。最も簡単なパターンとして、ローカルイメージを内部レジストリーにPushすることで、イメージストリームにイメージが登録されることを確認しました。今回は、Dockerfileでイメージをビルドして内部レジストリーに登録する方法を説明します。もちろん、ローカル環境でイメージをビルドすることもできますが、ここでは、OpenShiftのイメージビルド機能を利用します。
イメージビルドの設定
OpenShiftのイメージビルド機能を利用する際は、「ビルド設定(BuildConfig)」を登録します。次は、GitHubの「https://github.com/enakai00/istest」に置いてあるDockerfileを使ってイメージをビルドするという設定の定義ファイルです。
httpd_bc.yml
apiVersion: v1 kind: BuildConfig metadata: name: httpd spec: output: to: kind: ImageStreamTag name: httpd:latest source: git: uri: https://github.com/enakai00/istest type: Git strategy: dockerStrategy: from: kind: ImageStreamTag name: centos7:latest type: Docker triggers: - imageChange: {} type: ImageChange
「source:」の部分で、Git上のファイルを使ってビルドすることが指定されています。また、「output:」の部分は、出来上がったイメージをイメージストリーム「httpd」にタグ名「latest」で登録することを指示しています。これは、実際には、「<プロジェクト名>/httpd:latest」という名前で内部レジストリーにPushすることで、前回説明した仕組みによって、自動登録される形になります。
さらに、「strategy:」の部分では、ここで作られるイメージは、イメージストリーム「centos7:latest」が指すイメージをベースイメージにすることを指定しており、Dockerfileの「FROM」指定は、このイメージで置き換えられます。その後にある「triggers:」では、依存するイメージが変更された時に自動的にビルドを開始することを指定しており、「centos7:latest」のイメージが更新されると、自動的に「httpd:latest」も再ビルドされることになります。
なお、ここでは、「strategy:」に「type: Docker」という指定があるので、Dockerfileを使った単純なビルド処理が行われます。この他には、簡易的なCIプロセスを回すビルド処理(Source to Image)も利用可能です。
このビルド設定を登録する前に、まず、イメージ出力先のイメージストリームを定義しておく必要があります。これは、次の定義ファイルで行ないます。
httpd_is.yml
apiVersion: v1 kind: ImageStream metadata: name: httpd
# oc create -f httpd_is.yml # oc get is NAME DOCKER REPO TAGS UPDATED baseos 172.30.84.64:5000/project01/baseos deploy 17 minutes ago centos7 172.30.84.64:5000/project01/centos7 latest 17 minutes ago httpd 172.30.84.64:5000/project01/httpd
それでは、ビルド設定を登録します。
# oc create -f httpd_bc.yml # oc get bc NAME TYPE FROM LATEST httpd Docker Git 0 # oc describe bc httpd Name: httpd Created: 28 seconds ago Labels: <none> Latest Version: Never built Strategy: Docker Source Type: Git URL: https://github.com/enakai00/istest From Image: ImageStreamTag centos7:latest Output to: ImageStreamTag httpd:latest Triggered by: ImageChange
イメージビルドの実行
「centos7:latest」の更新をトリガーにして、自動的にビルドが行われるはずですが、まずは、手動でビルドを実行してみます。
# oc start-build httpd httpd-1
ここで表示された「httpd-1」は、ビルド処理を表すリソースです。次のようにビルド処理が実行されていることが分かります。
# oc get build NAME TYPE FROM STATUS STARTED DURATION httpd-1 Docker Git Running 2 seconds ago 2s
次のコマンドで、ビルド処理のログが確認できます。
# oc logs -f build/httpd-1 ... I1228 12:22:25.400023 1 docker.go:86] Pushing image 172.30.84.64:5000/project01/httpd:latest ... I1228 12:23:01.568623 1 docker.go:90] Push successful
最後に完成したイメージが内部レジストリーにPushされていることが分かります。イメージストリーム「httpd」を見ると、確かに完成したイメージが登録されています。
# oc describe is httpd Name: httpd Created: 30 minutes ago Labels: <none> Annotations: openshift.io/image.dockerRepositoryCheck=2015-12-28T11:53:04Z Docker Pull Spec: 172.30.84.64:5000/project01/httpd Tag Spec Created PullSpec Image latest <pushed> 34 seconds ago 172.30.84.64:5000/project01/httpd@sha256:aa8810cc8df8881c94d2e4f7372d59414106a362fd24a23f0817174975a3d05c
ビルド設定の情報を見ると、過去のビルドの履歴が分かります。
# oc describe bc httpd Name: httpd Created: 12 minutes ago Labels: <none> Latest Version: 1 Strategy: Docker Source Type: Git URL: https://github.com/enakai00/istest From Image: ImageStreamTag centos7:latest Output to: ImageStreamTag httpd:latest Triggered by: ImageChange Build Status Duration Creation Time httpd-1 complete 51s 2015-12-28 21:22:11 +0900 JST
それでは、「centos7:latest」の更新に伴う、自動ビルドの様子も確認しておきます。次のコマンドで、「centos7:latest」を更新します。(特に意味はありませんが、lsofパッケージを追加してみます。)
# cat <<EOF >work/Dockerfile FROM registry.oso.example.com/project01/centos7:latest MAINTAINER E.Nakai RUN yum -y install net-tools lsof EOF # docker build -t registry.oso.example.com/project01/centos7:latest work # docker push registry.oso.example.com/project01/centos7:latest
次のように、新たなビルド処理が開始しています。
# oc get build NAME TYPE FROM STATUS STARTED DURATION httpd-1 Docker Git Complete 32 minutes ago 51s httpd-2 Docker Git Running 6 seconds ago 6s
ビルドが完了すると、次のようになります。
# oc describe is httpd Name: httpd Created: About an hour ago Labels: <none> Annotations: openshift.io/image.dockerRepositoryCheck=2015-12-28T11:53:04Z Docker Pull Spec: 172.30.84.64:5000/project01/httpd Tag Spec Created PullSpec Image latest <pushed> 2 minutes ago 172.30.84.64:5000/project01/httpd@sha256:6704b116427410615eab190e55ef200f3679c85cdf90bef48a6f5bf345341492 34 minutes ago 172.30.84.64:5000/project01/httpd@sha256:aa8810cc8df8881c94d2e4f7372d59414106a362fd24a23f0817174975a3d05c # oc describe bc httpd Name: httpd Created: 36 minutes ago Labels: <none> Latest Version: 2 Strategy: Docker Source Type: Git URL: https://github.com/enakai00/istest From Image: ImageStreamTag centos7:latest Output to: ImageStreamTag httpd:latest Triggered by: ImageChange Build Status Duration Creation Time httpd-2 complete 56s 2015-12-28 21:54:37 +0900 JST httpd-1 complete 51s 2015-12-28 21:22:11 +0900 JST
この他には、Webhookを使って、GitHub上のコンテンツが更新されたことをトリガーとして、ビルド処理を自動で開始するような設定も可能です。
後片付け
次のコマンドでプロジェクトを削除すると、プロジェクト内で定義したものはすべて綺麗になくなります。プロジェクト内で起動していたコンテナも停止します。
# oc delete project project01