Artifact Registry for Docker への認証を構成するが初見でよく理解できなかったため、前提となるDockerレジストリの認証周りの情報を整理した上で、噛み砕いたものをアウトプット。
Dockerレジストリ
Dockerイメージを保存・配布するシステム。
具体的なサービス名としては、DockerHub, GCP の Artifact Registryなど。
Dockerレジストリは複数のリポジトリから構成され、リポジトリは複数のイメージを管理する。
同名のイメージのバージョンはタグで管理される。
docker loginコマンド
doceker push
やdocker pull
コマンドを実行するために、操作対象のdockerレジストリにログインするコマンド。
docker login <オプション> <dockerレジストリのURL>
オプション
-u
: ユーザ名を指定
-p
: パスワードを直接指定
--password-stdin
: Linuxコマンドのパイプでパスワードを指定するときに使う。シェルのhistoryにパスワードが丸見えで残ったりしないので安全。
認証情報ヘルパー(credential helper)
dockerレジストリの認証情報(ユーザー名, パスワード)を外部ストア(Macのキーチェーンとか)を利用して管理(保存・取得)するためのプログラム群。
プログラム名は docker-credential-xxx
という名前で統一されている
例.
- docker-credential-osxkeychain: Macのキーチェーンで管理されている認証情報
- docker-credential-gcloud: gcloudコマンドで管理されている認証情報
docker login
実行時に認証情報をオプションで指定しない場合、~/.docker/config.json
に記載されている「どのレジストリへログインするときにどの認証情報ヘルパーを使うのか」の設定に基づいて、認証情報ヘルパー経由で外部ストアから認証情報を取得してレジストリへのログインを試みてくれる模様。
コマンド
docker-credential-xxx store
外部ストアに認証情報を保存する。
docker-credential-gcloud
の場合は、gcloudコマンドにおける現在アクティブなユーザーアカウント or アクティブなサービスアカウントの認証情報が使われるため、自らstoreコマンドを実行することはないはず。
gloudコマンドでの認証については、gcloudコマンドまとめの gcloud auth login
や gcloud auth activate-service-account
を参照
docker-credential-xxx get
外部ストアから認証情報を取得する。
設定に基づき、指定したレジストリへのログインに使われる具体的な認証情報(ユーザ名、パスワード)を知るには、以下のコマンドを実行する
echo https://<config.jsonに登録したレジストリ> | docker-credential-<config.jsonに登録した認証情報ヘルパーのサフィックス> get
例.
echo https://us-central1-docker.pkg.dev | docker-credential-gcloud get
=>
{
"Secret": ".............................",
"Username": "_dcgcloud_token"
}
~/.docker/config.json
dockerの認証情報の設定ファイル。
# 例.
# - デフォルトで認証情報ヘルパーdocker-credential-desktop を使う
# - Dockerレジストリが us-east1-docker.pkg.dev である場合、認証情報ヘルパーdocker-credential-gcloudを使う
{
"credsStore": "desktop",
"credHelpers": {
"us-east1-docker.pkg.dev": "gcloud"
}
}