GitHub Personal Access Tokenを使ってPrivateレポジトリをDockerビルド時にcloneする
概要
- Dockerビルド時にPrivateレポジトリをcloneしたい
- 秘密鍵は漏洩リスクが高いしあんまり扱いたくない
- 権限を制御できるGitHub Personal Access Token (PAT) を使ってみる
手順
1. PATの作成
https://github.com/ で自分のアイコンから以下のように遷移する。
- Settings
- Developer Settings
- Personal access tokens
- Fine-grained tokens
そして、Generate new token から新しいトークンを作成する。
各項目は任意で埋めてもらっていいが、今回は特定のPrivateレポジトリが対象という想定なので、取り立てて注記するなら
- Repository access → Only select repositories で必要最小限のレポジトリを選択する
- 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 に ENV
や ARG
を通して渡してはいけないということだけ。そのように渡された値はイメージに残るためセキュリティリスクとなる。
そのようなシークレットを扱う手段として、Build 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 \
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_PAT
の env=GITHUB_PAT
は比較的新しい記法で、Docker Engine v27.3.0
でしかサポートされていないらしい。
それより古いバージョンではどうするかというと、シークレットの値は実際には /run/secrets/<id>
に格納されているので、直接その値を参照すれば良い。
例えば、上の Dockerfile では以下のように書き直せばいい。
RUN \
git clone https://$(cat /run/secrets/github_pat)@github.com/some-username/some-private-repository.git .
Discussion