docker login の認証情報が保存できない(毎回ログインを求められる)
~/.docker/config.json の credsStore が OS のキーチェーンに対応していないと認証情報が保存されない。
OS ごとの credential helper をインストールし、credsStore を明示する。
公開:
要約
docker login の認証情報は ~/.docker/config.json の credsStore で指定された credential helper(OS キーチェーン)に格納される。
helper が未設定または未インストールだと保存されず、Login Succeeded の表示の後に docker pull が 401 Unauthorized を返すループが続く。
OS に合った helper をインストールして config.json に credsStore を明示すれば解消する。
よくある原因
~/.docker/config.jsonのcredsStoreキーが無く、authsセクションも空になっている- macOS で Docker Desktop を使っていないのに
docker-credential-osxkeychainが PATH に無い - Linux で
docker-credential-secretserviceやdocker-credential-passがインストールされていない sudo docker loginで root の/root/.docker/config.jsonに保存され、通常ユーザーから参照されない- Docker Desktop のサインアウト後に config.json が再初期化されている
解決策
1. credential helper をインストール
OS ごとのインストール例。
# macOS(Docker Desktop に同梱)
which docker-credential-osxkeychain
# 無い場合は brew で導入
# brew install docker-credential-helper
# Linux: docker-credential-helpers の Release から取得
curl -L https://github.com/docker/docker-credential-helpers/releases/latest/download/docker-credential-secretservice-amd64 \
-o /usr/local/bin/docker-credential-secretservice
chmod +x /usr/local/bin/docker-credential-secretserviceリポジトリと対応 OS の一覧は docker/docker-credential-helpers を参照。
2. config.json で credsStore を指定
{
"credsStore": "osxkeychain"
}複数のレジストリで helper を分けるなら credHelpers を使う。
{
"credHelpers": {
"ghcr.io": "osxkeychain",
"registry.example.com": "pass"
}
}CLI 仕様と保存先の挙動は docker login | Docker Docs に詳述されている。
3. ログインし直す
docker logout
docker login ghcr.io -u USERNAME --password-stdin <<<"$GITHUB_TOKEN"ログイン後に ~/.docker/config.json の auths セクションが空(helper に格納された証拠)で、docker pull が認証エラー無く通れば成功。
4. ユーザーごとの config.json を揃える
sudo で叩くと /root/.docker/config.json に保存されるため、通常ユーザーの実行で再認証が要る。docker グループにユーザーを追加するか、rootless Docker を使い、常に同じユーザーで実行する。
CI でも実行ユーザーを揃え、$DOCKER_CONFIG 環境変数で config ディレクトリを明示するとさらに安全。