はじめに
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を実施する流れの参考になれば幸いです。