めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

OpenShift OriginによるDockerイメージ管理(2)〜Dockerfileによるイメージビルドを自動化

はじめに

enakai00.hatenablog.com

前回は、上記の記事でイメージストリームの概念を理解しました。最も簡単なパターンとして、ローカルイメージを内部レジストリーにPushすることで、イメージストリームにイメージが登録されることを確認しました。今回は、Dockerfileでイメージをビルドして内部レジストリーに登録する方法を説明します。もちろん、ローカル環境でイメージをビルドすることもできますが、ここでは、OpenShiftのイメージビルド機能を利用します。

(参考資料)
OpenShift Origin Latest/Developer Guide/Builds

イメージビルドの設定

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