注意事項

その後の検証で --ssh オプションでも同等に動作することの検証が取れたのでこちらを参照してください。

はじめに

長いタイトルになってしまいましたが、表題のとおりです笑

cloudbuild内でプライベートリポジトリを参照する方法も、docker build内でプライベートリポジトリを参照する方法もどちらも色々と記事があったのですが、併せると中々なかったのでメモしておきます

やったこと

結論

ざっくりいうと、以下のようにすれば動きます。

ポイントは

  • private repositoryの秘密鍵はSecretManager経由で渡す
  • docker buildはBUILDKITを有効化した上で、秘密鍵を–secretオプションでマウントする
  • Dockerfile内では--mountオプションで秘密鍵を利用する
 1steps:
 2- name: 'gcr.io/cloud-builders/git'
 3  secretEnv: ['SSH_KEY']
 4  entrypoint: 'bash'
 5  args:
 6  - -c
 7  - |
 8    echo "$$SSH_KEY" >> /root/.ssh/id_rsa
 9    chmod 400 /root/.ssh/id_rsa
10    ssh-keyscan -t rsa github.com >  /root/.ssh/known_hosts    
11  volumes:
12  - name: 'ssh'
13    path: /root/.ssh
14
15- name: gcr.io/cloud-builders/docker:latest
16  dir: k8s_pipelines
17  entrypoint: bash
18  args:
19  - -c
20  - |-
21    set -eux
22    docker build --secret id=ssh,src=/root/.ssh/id_rsa -f Dockerfile -t tag-name:latest .    
23  env:
24    - "DOCKER_BUILDKIT=1"
25  volumes:
26  - name: 'ssh'
27    path: /root/.ssh
28
29availableSecrets:
30  secretManager:
31  - versionName: projects/project_id/secrets/SSH_KEY/versions/latest
32    env: 'SSH_KEY'
33timeout: 3600s
 1FROM python:3.10
 2
 3RUN pip install poetry
 4
 5COPY pyproject.toml /workspace/
 6COPY poetry.lock /workspace/
 7WORKDIR /workspace
 8
 9RUN mkdir -m 700 ~/.ssh
10RUN ssh-keyscan -t rsa github.com > ~/.ssh/known_hosts
11RUN --mount=type=secret,id=ssh,target=/root/.ssh/id_rsa poetry config virtualenvs.create true \
12    && poetry config virtualenvs.in-project true \
13    && poetry install

CloudBuild内でシークレットを利用してプライベートリポジトリを参照する

こちらに関しては公式ドキュメントが参考になるのでこちらを確認してください。

docker build内のpoetryからプライベートリポジトリを参照できるようにする

これはネット上に色々転がっているのですが、よく出てくる--sshでマウントする方法だと私のローカルではうまくいったものの、cloudbuild側ではうまくいきませんでした。

2022/06/28追記: できました。こちらを確認してください。以下はSecretをマウントする方式で実現する場合の手順となります。

そこで、同様にBuildkitのドキュメント内を調べていくとこちらにシークレットのマウントのやり方に関する記載がありましたので、これを利用するようにしました。

具体的にはまずcloudbuild側(実行側)で

1docker build --secret id=ssh,src=/root/.ssh/id_rsa -f Dockerfile -t tag-name:latest .

このようにすることで、id=sshというシークレットにローカルの/root/.ssh/id_rsa/を割り当てています。 そして、Dockerfile内で

1RUN --mount=type=secret,id=ssh,target=/root/.ssh/id_rsa poetry config virtualenvs.create true \
2    && poetry config virtualenvs.in-project true \

このようにすると、このRUN中だけシークレットが参照できるようになります。