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.4
はregistry.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.4
をcustom-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