深夜2時のデプロイメントの悪夢緊急のホットフィックスをプッシュしている最中だとしましょう。docker loginやdocker pushを実行し、スムーズな認証を期待していたところ、ターミナルにイライラさせるエラーメッセージが表示され、パイプラインが停止してしまいました。
error getting credentials - err: exec: "docker-credential-desktop": executable file not found in $PATH, out: ""
これは通常、MacやWindows環境からネイティブのLinuxマシンに設定を移行した際、あるいは最近Docker Desktopをアンインストールしたが古い設定ファイルが残っている場合に発生します。Docker CLIが、現在のシステムには存在しないヘルパープログラムを探してしまっているのです。
なぜDockerは「desktop」を探しているのか?Dockerはデフォルトではパスワードをプレーンテキストで保存しません。「クレデンシャルヘルパー」と呼ばれる、OSのキーチェーン(macOSのKeychainやWindowsのクレデンシャルマネージャーなど)とやり取りするための小さな外部バイナリを使用します。WindowsやMacでは、Docker Desktopがdocker-credential-desktopというデフォルトのヘルパーとして設定されます。
~/.docker/config.jsonファイルを、Docker DesktopがインストールされていないLinuxサーバーやWSL2インスタンスにコピーすると、Docker CLIは依然としてその特定のバイナリを見つけようとします。それが$PATH内に存在しないため、コマンドは即座に失敗します。
クイックフィックス:設定のクリーンアップ今すぐログインを機能させる必要がある場合、最も早い方法はDockerにdesktopヘルパーを探すのをやめるよう指示することです。Dockerの設定ファイルを開きます。
nano ~/.docker/config.json
次のような行を探してください。
{
"auths": { ... },
"credsStore": "desktop"
}
"credsStore": "desktop"の行を完全に削除します。それがオブジェクトの最後の項目である場合は、JSONの有効性を保つために、前の行の末尾にあるカンマも削除してください。ファイルは以下のようになります。
{
"auths": {
"https://index.docker.io/v1/": {}
}
}
ファイルを保存して、再度docker loginを試してください。ユーザー名とパスワードの入力が求められ、それらが保存されるはずです(おそらくプレーンテキストまたはローカルのbase64形式で保存されます。セキュリティ面では理想的ではありませんが、クイックフィックスとしては機能します)。
恒久的な修正:Linuxでの安全なクレデンシャル管理credsStoreの行を削除するだけでも機能しますが、クレデンシャルがbase64エンコードされた文字列としてconfig.json内に無防備な状態で残ってしまいます。より良いアプローチは、Linuxネイティブのクレデンシャルヘルパーを使用することです。
オプション1:「pass」を使用する(標準的な方法)passユーティリティは、Linux上のDockerで最も一般的なクレデンシャルストアです。まず、必要なパッケージをインストールします。
sudo apt-get update
sudo apt-get install pass docker-credential-helpers
次に、GPGキーを持っていない場合は初期化する必要があります。
gpg --generate-key
# プロンプトに従ってキーを作成します
# キーの一覧を表示してIDを取得します
gpg --list-secret-keys --keyid-format LONG
# 取得したキーIDでpassを初期化します
pass init "YOUR_KEY_ID"
次に、~/.docker/config.jsonを更新してpassヘルパーを使用するように設定します。
{
"auths": { ... },
"credsStore": "pass"
}
オプション2:「secretservice」を使用するUbuntu DesktopなどのデスクトップLinux環境を使用している場合は、GNOME KeyringやKWalletと統合されたSecret Serviceヘルパーを使用できます。
sudo apt-get install docker-credential-secretservice
その後、config.jsonを更新します。
{
"credsStore": "secretservice"
}
修正の確認これらの変更を行った後、再度ログインしてDockerが新しいストアを正しく使用しているか確認します。
docker login
ログイン後、~/.docker/config.jsonを確認してください。authsの下にレジストリのエントリが表示されているはずですが、base64文字列を含むauthプロパティは存在しないはずです。代わりに、クレデンシャルは選択したクレデンシャルストアに安全に保管されています。
ヒントと予防策config.jsonを手動で編集する際、余分なカンマを残したり、閉じ括弧を忘れたりしやすく、それが原因でDockerが「invalid character」エラーを吐くことが多々あります。ヘッドレスサーバーでこれらのファイルを微調整する場合、私は保存前にフォーマッタを使用して構造を検証するようにしています。
個人的には、設定をクリーンに保つためにToolCraftのJSON Formatter & Validatorを使用しています。ブラウザベースでローカルに動作するため、設定データがサーバーに送信される心配もありません。複雑なauthsオブジェクトやネストされた設定を扱う際の救世主です。
これらの手順に従うことで、環境固有のエラーから解放され、堅牢で安全なLinuxクレデンシャル設定へと移行できました。もう深夜のデプロイで立ち往生することはありません。

