レジストリへ push する - registry push
ビルドしたイメージはレジストリに push して初めて本番で使える。GHCR・ECR・GAR・Docker Hub など目的地ごとに認証・命名・保管ポリシーが異なる。
概念図
構文
bash
docker push <registry>/<namespace>/<repo>:<tag>実例
OIDC で短命クレデンシャルを得て ECR に push する。
bash
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789012:role/gha-ecr-push
aws-region: ap-northeast-1
- uses: aws-actions/amazon-ecr-login@v2
- uses: docker/build-push-action@v6
with:
context: .
push: true
tags: 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/app:${{ github.sha }}主要レジストリの比較
| レジストリ | ホスト | 認証の定番 | 主な特徴 |
|---|---|---|---|
| GHCR | ghcr.io |
GITHUB_TOKEN / PAT |
リポジトリと権限を統合管理。public / private を細かく切り替え |
| Docker Hub | docker.io |
アクセストークン | 知名度が高いが、匿名 pull のレート制限が厳しい |
| AWS ECR | <acct>.dkr.ecr.<region>.amazonaws.com |
IAM(OIDC 推奨) | VPC エンドポイント経由で AWS 内に閉じられる |
| Google Artifact Registry | <region>-docker.pkg.dev |
Workload Identity Federation | GCP 内の IAM / 組織ポリシーが活きる |
| Azure Container Registry | <name>.azurecr.io |
Entra ID / アクセストークン | Entra ID 側のロール管理と統合 |
個人・OSS は GHCR / Docker Hub、クラウド本番は自社クラウドの純正レジストリ(ECR / GAR / ACR)に押し込むのが素直です。
認証: 長期キーから OIDC へ
伝統的な方法は「アクセスキー / シークレット」を CI の Secrets に保存することでしたが、漏洩時の影響が大きいため、短命クレデンシャル + OIDC への移行が進んでいます。
- AWS ECR:
aws-actions/configure-aws-credentials@v4が GitHub Actions の OIDC を使ってsts:AssumeRoleWithWebIdentityを実行する。IAM 側で信頼ポリシーを設定すれば、長期 Access Key を置かずに済む - Google Artifact Registry: Workload Identity Federation で同様に OIDC からサービスアカウントになり代わる
- Azure Container Registry: GitHub Actions OIDC → Entra ID のフェデレーション資格情報
GHCR や Docker Hub はこの流れに完全には乗っていませんが、PAT のスコープを push 対象リポジトリに絞る/回数制限のある組織トークンを使う、等の運用で限定的に代替します。
タグ戦略と保管ポリシー
本番で推奨されるのは次の 3 種の併用です。
- 不変タグ:
sha-<short>/v1.2.3のようにビルド成果物を 1:1 で指す。デプロイ・ロールバックはこれを指定する - 可変タグ:
latest/main/stableのように「今の最新」を指す。ローカル開発の pull だけに使う - 環境タグ:
prod/stagingのように「今その環境で動いている版」を指す。デプロイ成功時に不変タグへ再アサインする運用にすると、環境別の最新がすぐわかる
イメージは放っておくとどんどん溜まるので、保管ポリシー(retention)で「最新 N 件を残す」「タグなしは X 日で削除」といったルールを設定します。
ECR なら Lifecycle Policy、GHCR なら Container retention、GAR なら Cleanup policies が相当機能です。
プッシュ前後の安全策
push は「ここから配布が始まる」瞬間なので、その前後に薄いチェックを足すとインシデントが減ります。
- push 前: イメージスキャン(Trivy 等)を失敗で止める/ベースイメージが想定どおりか
docker/metadata-actionのannotationsで確認 - push 時: sigstore (cosign) で署名する。検証する側は
cosign verifyで改ざんを検出できる - push 後: SBOM(Software Bill of Materials)を生成してアーティファクトに同梱する。GitHub Actions の
anchore/sbom-actionなどが手軽
これらは「1 回だけ通せば満足」ではなく、全ブランチの全 push に機械的に組み込むのが本来の姿です。
関連トピック
GitHub Actions- GitHub Actions はリポジトリのイベントに応じてワークフローを実行する CI/CD サービス。`docker/build-push-action` を組み合わせれば、数十行の YAML でビルドとプッシュまで自動化できる。 buildx cache- BuildKit のキャッシュを CI で再利用すると、ビルド時間を大幅に短縮できる。GitHub Actions の `gha` キャッシュやレジストリ型キャッシュを使い分ける。 scan in CI- Trivy・Grype・Snyk などのスキャナを CI に組み込み、既知脆弱性のあるイメージをレジストリに上げない/本番に出さない、というゲートを作る。 