できない.dev

docker login の認証情報が保存できない(毎回ログインを求められる)

~/.docker/config.json の credsStore が OS のキーチェーンに対応していないと認証情報が保存されない。
OS ごとの credential helper をインストールし、credsStore を明示する。

#docker#login#credentials#credsStore#registry

公開:

要約

docker login の認証情報は ~/.docker/config.jsoncredsStore で指定された credential helper(OS キーチェーン)に格納される。
helper が未設定または未インストールだと保存されず、Login Succeeded の表示の後に docker pull401 Unauthorized を返すループが続く。
OS に合った helper をインストールして config.jsoncredsStore を明示すれば解消する。

よくある原因

  1. ~/.docker/config.jsoncredsStore キーが無く、auths セクションも空になっている
  2. macOS で Docker Desktop を使っていないのに docker-credential-osxkeychain が PATH に無い
  3. Linux で docker-credential-secretservicedocker-credential-pass がインストールされていない
  4. sudo docker login で root の /root/.docker/config.json に保存され、通常ユーザーから参照されない
  5. 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.jsonauths セクションが空(helper に格納された証拠)で、docker pull が認証エラー無く通れば成功。

4. ユーザーごとの config.json を揃える

sudo で叩くと /root/.docker/config.json に保存されるため、通常ユーザーの実行で再認証が要る。docker グループにユーザーを追加するか、rootless Docker を使い、常に同じユーザーで実行する。
CI でも実行ユーザーを揃え、$DOCKER_CONFIG 環境変数で config ディレクトリを明示するとさらに安全。

この記事は役立ちましたか?