nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

OpenShiftのs2iイメージをカスタマイズする

OpenShift 全部俺 Advent Calendar 2017

昨日は忘年会でした。全部俺 Advent Calendarがすごく大変そう、と言われましたが各エントリ20分程度で書いていますし、そうなるように内容を調整しています。例えば昨日のエントリは17時くらいに同僚に何書いて欲しい?と聞いてから最新の情報をちょっと調べて書いて飲みに行った、くらいのノリです。

今日はデフォルトのs2iイメージをカスタマイズしてみましょう。例ではRubyを利用します。

$ oc new-project test-custom-s2i
$ oc new-app http://github.com/nekop/hello-sinatra
$ oc get all
oc NAME                         TYPE      FROM      LATEST
buildconfigs/hello-sinatra   Source    Git       1

NAME                     TYPE      FROM          STATUS    STARTED          DURATION
builds/hello-sinatra-1   Source    Git@cf28c79   Running   49 seconds ago   

NAME                         DOCKER REPO                                                      TAGS      UPDATED
imagestreams/hello-sinatra   docker-registry.default.svc:5000/test-custom-s2i/hello-sinatra             

NAME                              REVISION   DESIRED   CURRENT   TRIGGERED BY
deploymentconfigs/hello-sinatra   0          1         0         config,image(hello-sinatra:latest)

NAME                       READY     STATUS    RESTARTS   AGE
po/hello-sinatra-1-build   1/1       Running   0          49s

oc describe bc hello-sinatra、そしてoc describe is ruby -n openshiftと追っていくと、利用されているImageStreamruby:2.4registry.access.redhat.com/rhscl/ruby-24-rhel7:latestを参照していることがわかります。

このイメージをDockerfileビルドを利用してカスタマイズしていきます。今回は単純にtouch /foobarなどとしてみます。

cat <<EOF | oc new-build --dockerfile=- --to=custom-ruby
FROM registry.access.redhat.com/rhscl/ruby-24-rhel7:latest
USER root
RUN touch /foobar
USER 1001
EOF

ビルドが開始されます。

$ oc get all
NAME                         TYPE      FROM         LATEST
buildconfigs/custom-ruby     Docker    Dockerfile   1
buildconfigs/hello-sinatra   Source    Git          1

NAME                     TYPE      FROM          STATUS     STARTED          DURATION
builds/custom-ruby-1     Docker    Dockerfile    Pending                     
builds/hello-sinatra-1   Source    Git@cf28c79   Complete   10 minutes ago   1m3s

NAME                         DOCKER REPO                                                      TAGS      UPDATED
imagestreams/custom-ruby     docker-registry.default.svc:5000/test-custom-s2i/custom-ruby               
imagestreams/hello-sinatra   docker-registry.default.svc:5000/test-custom-s2i/hello-sinatra   latest    9 minutes ago
imagestreams/ruby-24-rhel7   docker-registry.default.svc:5000/test-custom-s2i/ruby-24-rhel7   latest    5 seconds ago

NAME                              REVISION   DESIRED   CURRENT   TRIGGERED BY
deploymentconfigs/hello-sinatra   1          1         1         config,image(hello-sinatra:latest)

NAME                       READY     STATUS      RESTARTS   AGE
po/custom-ruby-1-build     0/1       Init:0/1    0          4s
po/hello-sinatra-1-build   0/1       Completed   0          10m
po/hello-sinatra-1-ddx5v   1/1       Running     0          9m

NAME                 DESIRED   CURRENT   READY     AGE
rc/hello-sinatra-1   1         1         1         9m

NAME                CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
svc/hello-sinatra   172.30.223.174   <none>        8080/TCP   10m

ビルドが終わったらbc/hello-sinatraのspec.strategy.sourceStragtegyのruby:2.4custom-ruby:latestに変更します。これでカスタマイズしたs2iイメージが利用されます。

$ oc edit bc/hello-sinatra
    sourceStrategy:
      from:
        kind: ImageStreamTag
        name: ruby:2.4
        namespace: openshift

変更後はこうなります。

    sourceStrategy:
      from:
        kind: ImageStreamTag
        name: custom-ruby:latest

BuildConfigはConfigChange triggerがデフォルトで有効になっているので、ビルドが自動的に開始され、レジストリにpushされ、DeploymentConfigのImageChange triggerが発動してデプロイされます。

$ oc get all
NAME                         TYPE      FROM         LATEST
buildconfigs/custom-ruby     Docker    Dockerfile   1
buildconfigs/hello-sinatra   Source    Git          2

NAME                     TYPE      FROM          STATUS     STARTED          DURATION
builds/custom-ruby-1     Docker    Dockerfile    Complete   6 minutes ago    54s
builds/hello-sinatra-1   Source    Git@cf28c79   Complete   16 minutes ago   1m3s
builds/hello-sinatra-2   Source    Git@cf28c79   Complete   4 minutes ago    19s

NAME                         DOCKER REPO                                                      TAGS      UPDATED
imagestreams/custom-ruby     docker-registry.default.svc:5000/test-custom-s2i/custom-ruby     latest    5 minutes ago
imagestreams/hello-sinatra   docker-registry.default.svc:5000/test-custom-s2i/hello-sinatra   latest    3 minutes ago
imagestreams/ruby-24-rhel7   docker-registry.default.svc:5000/test-custom-s2i/ruby-24-rhel7   latest    6 minutes ago

NAME                              REVISION   DESIRED   CURRENT   TRIGGERED BY
deploymentconfigs/hello-sinatra   2          1         1         config,image(hello-sinatra:latest)

NAME                       READY     STATUS      RESTARTS   AGE
po/custom-ruby-1-build     0/1       Completed   0          6m
po/hello-sinatra-1-build   0/1       Completed   0          16m
po/hello-sinatra-2-build   0/1       Completed   0          4m
po/hello-sinatra-2-t4dpb   1/1       Running     0          3m

NAME                 DESIRED   CURRENT   READY     AGE
rc/hello-sinatra-1   0         0         0         15m
rc/hello-sinatra-2   1         1         1         3m

NAME                CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
svc/hello-sinatra   172.30.223.174   <none>        8080/TCP   16m

新しくデプロイされたコンテナに入ると、ちゃんとカスタマイズが反映されています。

$ oc rsh dc/hello-sinatra ls -la /foobar
-rw-r--r--. 1 root root 0 Dec 13 08:41 /foobar