結論

  • 先日、cloudbuild上でdocker buildするときに--sshを渡す方法だとうまく動作しないと書きましたが、再検証したら動いたのでメモします。

  • おそらく、known_hostsを追加していなかったとかそんな感じだと思われます・・・ださい。

  • 追検証の体なので、そういう形式で書いていますので、結論だけ知りたい方は最下部に行ってください。

検証ログ

on Local

適当なプライベートリポジトリ marufeuille/privare_repository_test を用意しローカル環境で以下を実行すると問題なくクローンできます(公開鍵は設定済みです)

# git clone git@github.com:marufeuille/privare_repository_test.git
Cloning into 'privare_repository_test'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.

では、このRepositoryを docker build 時にcloneすることを考えます。

次のようなDockerfileを考えます。

FROM ubuntu:22.04

RUN apt update && apt install -y openssh-client git
RUN git clone git@github.com:marufeuille/privare_repository_test.git

そしてこれをbuildすると当然落ちます。

# docker build -t test .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM ubuntu:22.04
 ---> 27941809078c
Step 2/3 : RUN apt update && apt install -y openssh-client git
 ---> Running in 23982a11b5e4

(中略)

Removing intermediate container 23982a11b5e4
 ---> 48d7bfc074b6
Step 3/3 : RUN git clone git@github.com:marufeuille/privare_repository_test.git
 ---> Running in b056b674da78
Cloning into 'privare_repository_test'...
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
The command '/bin/sh -c git clone git@github.com:marufeuille/privare_repository_test.git' returned a non-zero code: 128

なので、Dockerfileを次のように書き換え

FROM ubuntu:22.04
RUN apt update && apt install -y openssh-client git
RUN mkdir -m 700 ~/.ssh && ssh-keyscan -t rsa github.com > ~/.ssh/known_hosts
RUN --mount=type=ssh git clone git@github.com:marufeuille/privare_repository_test.git

次にssh-agentをたちあげ、その後適切なオプションを渡すことでコンテナ側に不要な秘密鍵を渡すことなくビルドすることができます。

# eval $(ssh-agent)
Agent pid 9334
# ssh-add /home/marufeuille/.ssh/id_rsa
Identity added: /home/marufeuille/.ssh/id_rsa (marufeuille@penguin)
# ssh-add -l
3072 SHA256:yYyoN155dKbZRmZEZm0rDWG/Az9tVi/32DWbxdtJHV8 marufeuille@penguin (RSA)
# DOCKER_BUILDKIT=1 docker build --ssh default -t test .
[+] Building 3.3s (6/7)                                                                                                                
[+] Building 6.8s (8/8) FINISHED                                                                                                       
 => [internal] load build definition from Dockerfile                                                                              0.2s
 => => transferring dockerfile: 279B                                                                                              0.0s
 => [internal] load .dockerignore                                                                                                 0.3s
 => => transferring context: 2B                                                                                                   0.0s
 => [internal] load metadata for docker.io/library/ubuntu:22.04                                                                   0.0s
 => [1/4] FROM docker.io/library/ubuntu:22.04                                                                                     0.0s
 => CACHED [2/4] RUN apt update && apt install -y openssh-client git                                                              0.0s
 => [3/4] RUN mkdir -m 700 ~/.ssh && ssh-keyscan -t rsa github.com > ~/.ssh/known_hosts                                           1.5s 
 => [4/4] RUN --mount=type=ssh git clone git@github.com:marufeuille/privare_repository_test.git                                   3.3s
 => exporting to image                                                                                                            1.5s
 => => exporting layers                                                                                                           1.4s
 => => writing image sha256:0a4b9e970ed98155faac957cd472bee06bdcf6dc8defeae380e98834ee3eb894                                      0.0s
 => => naming to docker.io/library/test   

なんですが、これをそのままcloudbuildに持ち込むと動きませんでした。

on cloudbuild

次に追加でこんな cloudbuild.yaml を用意します。

steps:
- name: 'gcr.io/cloud-builders/git'
  secretEnv: ['SSH_KEY']
  entrypoint: 'bash'
  args:
  - -c
  - |
    echo "$$SSH_KEY" >> /root/.ssh/id_rsa
    chmod 400 /root/.ssh/id_rsa
    ssh-keyscan -t rsa github.com >> /root/.ssh/known_hosts
  volumes:
  - name: 'ssh'
    path: /root/.ssh

- name: 'gcr.io/cloud-builders/docker'
  entrypoint: bash
  args:
  - -c
  - |-
  - set -eux
  - eval $(ssh-agent)
  - ssh-add /root/.ssh/id_rsa
  - docker build --ssh default -t test .
  env:
  - "DOCKER_BUILDKIT=1"
  volumes:
  - name: 'ssh'
    path: /root/.ssh

availableSecrets:
  secretManager:
  - versionName: projects/PROJECT_ID/secrets/secret-name/versions/latest
    env: 'SSH_KEY'

そして gcloud builds submit . をすれば動きますが、シークレットの設定やcloudbuildのSAにシークレットアクセサの付与をしてから実施してください。