Zenn
🔖

GitHub Personal Access Tokenを使ってPrivateレポジトリをDockerビルド時にcloneする

2025/03/24に公開

概要

  • Dockerビルド時にPrivateレポジトリをcloneしたい
  • 秘密鍵は漏洩リスクが高いしあんまり扱いたくない
  • 権限を制御できるGitHub Personal Access Token (PAT) を使ってみる

手順

1. PATの作成

https://github.com/ で自分のアイコンから以下のように遷移する。

  1. Settings
  2. Developer Settings
  3. Personal access tokens
  4. Fine-grained tokens

そして、Generate new token から新しいトークンを作成する。

各項目は任意で埋めてもらっていいが、今回は特定のPrivateレポジトリが対象という想定なので、取り立てて注記するなら

  1. Repository access → Only select repositories で必要最小限のレポジトリを選択する
  2. Permissions で必要最小限の権限を選択(clone するだけなら Repository permissions → Contents に Read-only だけでいい)

Generate token を選択すれば新しいPATが作成されるので、トークンを記録しておく。

2. Dockerファイルの作成

後は、PATを用いてレポジトリをcloneするコマンドをDockerfileに書くだけ。

例えば、先程記録したPATが環境変数 GITHUB_PAT に格納されているものとして、Privateレポジトリは以下のようにhttps経由でcloneできる。

git clone https://${GITHUB_PAT}@github.com/some-username/some-private-repository.git .

注意点としては、PATのようなシークレットを Docker に ENVARG を通して渡してはいけないということだけ。そのように渡された値はイメージに残るためセキュリティリスクとなる。

そのようなシークレットを扱う手段として、Build secrets があるのでそれを使用する。

https://docs.docker.com/build/building/secrets/

いくつか種類があるが、今回のケースでは Secret mounts で十分。

Secret mounts では、--secret フラグを用いてシークレットを渡す。例えば、環境変数 GITHUB_PAT の値を渡したい場合は、以下のように渡せる(idは任意)。

docker build --secret id=github_pat,env=GITHUB_PAT .

もしくは、PAT が github_pat.txt に記述されている場合は以下のようにも渡せる。

docker build --secret id=github_pat,src=github_pat.txt .

渡されたシークレットは、RUN--mount=type=secret フラグを通して消費できる。例えば、上のコマンドの id=github_pat を使いたい場合は、以下のように Dockerfile を書けばいい。

FROM ubuntu:latest

RUN apt-get update && apt-get install -y git

WORKDIR /app

RUN --mount=type=secret,id=github_pat,env=GITHUB_PAT \
    git clone https://${GITHUB_PAT}@github.com/some-username/some-private-repository.git .

追記(2025-03-25)

RUN --mount=type=secret,id=github_pat,env=GITHUB_PATenv=GITHUB_PAT は比較的新しい記法で、Docker Engine v27.3.0 でしかサポートされていないらしい。

https://zenn.dev/tksx1227/articles/4af1ce9b9e475a

それより古いバージョンではどうするかというと、シークレットの値は実際には /run/secrets/<id> に格納されているので、直接その値を参照すれば良い。

例えば、上の Dockerfile では以下のように書き直せばいい。

RUN --mount=type=secret,id=github_pat \
    git clone https://$(cat /run/secrets/github_pat)@github.com/some-username/some-private-repository.git .

Discussion

ログインするとコメントできます