注意事項
その後の検証で --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
中だけシークレットが参照できるようになります。