(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Tekton/Kubernetes】dockerbuildでimageを生成するTaskの例

スポンサーリンク

はじめに

Tektonを利用したCI/CDの中でコンテナイメージは/kaniko/executorを利用している例が多かったので、自学のためにあえてkanikoを利用せずにdocker buildしてみました。ちなみに、KanikoはDockerコンテナ内でDockerイメージをビルドできるツールなので特にこだわりがなければ自前ではなくKanikoを利用した方が便利だとは思います。

    command:
    - /kaniko/executor
環境情報
  • Windows 10
  • Cygwin
  • DockerDesktop 2.4 (DE 19.03, K8s 1.18)
  • pipeline.tekton.dev/release: "v0.17.0"

方針

Build用のコンテナの中からOutside of Dockerでdocker buildを行います。

利用するDockerfileはConfigMapで事前に作成しておきました。

$ kubectl create configmap mydockerfile --from-file=C:\\tmp\\share\\Dockerfile
$ kubectl get configmap
NAME           DATA   AGE
mydockerfile   1      xm

TaskのYAML

apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
  name: build-dockerimage
spec:
  steps:
    - name: build-nginx
      image: docker
      command: ["docker"]
      args:
        - "build"
        - "-t"
        - "mynginx"
        - "-f"
        - "/config/Dockerfile"
        - "/config"
      volumeMounts:
        - name: docker-socket
          mountPath: /var/run/docker.sock
        - name: config
          mountpath: /config/
  volumes:
    - name: docker-socket
      hostPath:
        path: /var/run/docker.sock
        type: Socket
    - name: config
      configMap:
        name: mydockerfile

/var/run/docker.sockをマウントすることでコンテナ内からホストのコンテナイメージにbuildできるようにしています。

ConfigMapを/config/Dockerfileとしてマウントしているので、同ファイルを-f /config/Dockerfileで指定します。
その次の/config部分は.で実行するとカレントディレクトリの下にあるディレクトリ群がignore対象として検知されエラーとなったので明示的にファイルがない/configを指定しています。

error checking context: 'file ('/proc/196/fd/5') not found or excluded by .dockerignore'.

Taskrunの実行

Taskを展開した状態で

$ kubectl apply -f build-dockerimage.yaml
task.tekton.dev/build-dockerimage created

以下のYAMLでTaskrunを実行すれば

apiVersion: tekton.dev/v1alpha1
kind: TaskRun
metadata:
  name: taskrun-build-dockerimage
spec:
  taskRef:
    name: build-dockerimage
$ kubectl create -f taskrun-build-dockerimage.yaml
taskrun.tekton.dev/taskrun-build-dockerimage created

正常にTaskが走りきり

$ kubectl get taskrun
NAME                        SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
taskrun-build-dockerimage   True        Succeeded   ..

新しいイメージが作成されています。

$ docker image ls | grep mynginx
mynginx ...

終わりに

Dockerコマンドでbuildを行う流れを記載しました。
CI/CDの流れを考慮するのであればDockerfileの更新後にConfigmapを再作成する必要があるので片手落ちではありますが、本記事がdockerイメージを利用してbuildを実施する流れの参考になれば幸いです。