🦔

サブディレクトリにあるDockerfileをCloud Build + kanikoでビルドする際の注意

2023/02/16に公開

Cloud Build で kaniko を使用すると、うまくキャッシュを利用して Docker イメージのビルドを高速化できます。[1]
kaniko を使用しない場合、以下のように dir でディレクトリを指定すれば、dir で指定したディレクトリをワークスペースとして docker build が実行されます。

steps:
- name: "gcr.io/cloud-builders/docker"
  args:
    [
      "build",
      "--target", "release-stage",
      "-t", "${LOCATION}-docker.pkg.dev/${PROJECT_ID}/${REPO_NAME}-api/release:latest",
      "-t", "${LOCATION}-docker.pkg.dev/${PROJECT_ID}/${REPO_NAME}-api/release:${REVISION_ID}",
      "--cache-from", "${LOCATION}-docker.pkg.dev/${PROJECT_ID}/${REPO_NAME}-api/release:latest",
      ".",
    ]
  dir: "api"

しかし、kaniko を使用する場合は以下のように、引数として context で指定してあげる必要があります。[2]

steps:
- name: 'gcr.io/kaniko-project/executor:latest'
  args:
  - --destination=${LOCATION}-docker.pkg.dev/${PROJECT_ID}/${REPO_NAME}-api/release:${REVISION_ID}
  - --destination=${LOCATION}-docker.pkg.dev/${PROJECT_ID}/${REPO_NAME}-api/release:latest
  - --cache=true
  - --context=dir://api
  - --skip-unused-stages
  - --target=release-stage

例えば、以下のように指定すると、ビルドは始まってくれるのですが、COPY などの指定がリポジトリルートからの相対パスになってしまいます。

steps:
- name: 'gcr.io/kaniko-project/executor:latest'
  args:
  - --destination=${LOCATION}-docker.pkg.dev/${PROJECT_ID}/${REPO_NAME}-api/release:${REVISION_ID}
  - --destination=${LOCATION}-docker.pkg.dev/${PROJECT_ID}/${REPO_NAME}-api/release:latest
  - --cache=true
  - --skip-unused-stages
  - --target=release-stage
  dir: "api"
脚注
  1. https://cloud.google.com/build/docs/optimize-builds/kaniko-cache?hl=ja ↩︎

  2. https://github.com/GoogleContainerTools/kaniko/issues/1427 ↩︎

Discussion