WordPressのローカル開発環境をMAMPからDDEVに移行しようとしたら、Dockerのイメージ取得でつまずきました。
エラーには docker-credential-osxkeychain という見慣れない文字列。私はそれまでDockerをほとんど使ったことがなく、認証情報を保存した覚えもありません。「なんでいきなり認証の話が出てくるんだろう」というのが最初の感想でした。
原因は、ずっと昔にDocker Desktopが書き込んだ設定ファイルが残っていたことでした。
前提:なぜDDEVとColimaなのか
MAMPからDDEVへ
これまでローカル環境はMAMPを使っていました。ただMAMPは、PHPやMySQLをMac本体に1セットだけ入れる仕組みです。そのため案件ごとにPHPのバージョンを変えたいときに困ります。
DDEVはDockerを使って、案件ごとに独立した環境を用意できるツールです。設定は .ddev/config.yaml というファイルに書かれるので、これをGitに含めておけば環境そのものをリポジトリで管理できます。ここが個人的にはいちばん魅力的でした。
なぜDocker DesktopではなくColimaなのか
DDEVを動かすにはDockerが必要です。Macで動かす選択肢としては、Docker Desktop、OrbStack、Colimaあたりがあります。
最初は動作が軽いと評判のOrbStackを入れてみました。ところが利用規約を読んでみると、無料プランは個人的・非商用の利用に限られていて、フリーランスとして仕事で使うならライセンスが必要とのこと。
それで、商用利用に制限のないColimaに切り替えることにしました。この判断自体は間違っていなかったのですが、切り替える過程でエラーに出くわします。
発生したエラー
Colimaを入れて、DDEVのプロジェクトを起動しようとしたときのことです。
ddev startDockerイメージのダウンロードが始まったものの、すぐに止まってしまいました。
[+] pull 0/6
⠋ Image ddev/ddev-traefik-router:v1.25.3 Pulling
⠋ Image ddev/ddev-utilities:latest Pulling
⠋ Image ddev/ddev-webserver:v1.25.3 Pulling
⠋ Image ddev/ddev-dbserver-mysql-8.0:v1.25.3 Pulling
Unable to pull Docker images: error getting credentials - err: exec: "docker-credential-osxkeychain": executable file not found in $PATH, out: ``問題は最後の行です。
error getting credentials - err: exec: "docker-credential-osxkeychain": executable file not found in $PATHdocker-credential-osxkeychain というコマンドが見つからない、と言われています。
正直、最初は何を言われているのかさっぱりでした。Dockerを本格的に使ったことはないし、プライベートリポジトリにログインした覚えもありません。取ってこようとしているのはDDEVの公開イメージだけです。認証なんて必要ないはずなのに、なぜ認証情報を探しに行くのか。
エラーの意味を分解してみる
落ち着いて読み解いてみると、こういう構造でした。
credential helper とは
Dockerには、プライベートリポジトリにログインするときの認証情報を安全にしまっておく仕組みがあります。パスワードを平文で config.json に書くのは危ないので、OSの安全な保管場所に預けようというわけです。
その橋渡し役が credential helper と呼ばれるプログラムです。macOSならキーチェーンに保存するための docker-credential-osxkeychain がそれにあたります。
なぜ存在しないヘルパーを呼びに行くのか
Dockerは ~/.docker/config.json を読み込んで、そこに credsStore の指定があれば、イメージを取得するたびに該当のヘルパーを起動しようとします。
このとき、認証が必要かどうかは関係ありません。 公開イメージを取ってくるだけでも、設定があれば律儀に呼びに行きます。
そして呼び出そうとしたヘルパーが存在しなければ、そこで止まる。これが今回のエラーの正体でした。
原因の特定
~/.docker/config.json の中身を見てみます。
cat ~/.docker/config.jsonこうなっていました。
{
"auths": {},
"credsStore": "osxkeychain",
"currentContext": "colima"
}しっかり credsStore が指定されています。でも docker-credential-osxkeychain の実体は、Docker Desktopに同梱されているプログラムです。
つまり、こういう状態だったわけです。
- 設定ファイルには「キーチェーンのヘルパーを使え」と書いてある
- でもDocker Desktopが入っていないので、ヘルパーの実体がない
- Dockerは言われたとおりヘルパーを探しに行って、見つからずに失敗する
auths が空になっていることからもわかるように、保存されている認証情報は何もありません。設定だけがぽつんと残っていた形です。
対処法
credsStore の記述を消せば解決します。公開イメージを取ってくるだけなら credential helper は要りません。
方法1:エディタで編集する
~/.docker/config.json を開いて、credsStore の行を削除します。
{
"auths": {},
"currentContext": "colima"
}JSONなので、行を消したあとにカンマが余らないよう気をつけてください。
方法2:jqを使う
コマンドで済ませたい場合は jq が便利です。
cp ~/.docker/config.json ~/.docker/config.json.bak
jq 'del(.credsStore)' ~/.docker/config.json > /tmp/dc.json && mv /tmp/dc.json ~/.docker/config.json
cat ~/.docker/config.json念のためバックアップを取ってから実行しています。jq が入っていなければ brew install jq でどうぞ。
動作確認
消したら、あらためて起動します。
ddev start今度はイメージのダウンロードが最後まで進んで、無事にプロジェクトが立ち上がりました。
なぜ設定だけが残っていたのか
ここが今回いちばん引っかかったところです。
~/.docker/config.json に credsStore を書き込むのは、基本的にDocker Desktopです。インストール時や初回のログイン時に自動で追記されます。
そしてDocker Desktopをアンインストールしても、このファイルは消えません。 ホームディレクトリ配下のユーザー設定として扱われるからです。
結果として、
- 過去にDocker Desktopをインストールした
- あとでアンインストールした
~/.docker/config.jsonのcredsStoreだけが残った- 数年後、別のDocker環境(ColimaやOrbStack)を入れたときに衝突する
という、時限爆弾みたいな状態ができあがります。
私自身、いつDocker Desktopを入れたのかまったく記憶がありませんでした。たぶん何年か前に一度試して、そのまま消したのだと思います。設定ファイルが残っていることなんて、当然覚えていません。
まとめ
docker-credential-osxkeychain: executable file not foundは、認証情報の保存先を指定した設定が残っているのに、その実体がないときに出る- 公開イメージを取ってくるだけでも、設定があればヘルパーを呼びに行くので失敗する
~/.docker/config.jsonからcredsStoreの記述を消せば解決する- この設定はDocker Desktopが書き込むもので、アンインストールしても残る
Docker Desktopから他のツールに乗り換えるときや、過去に一度でもDocker Desktopを触ったことがある場合は、先に ~/.docker/config.json を確認しておくと余計な回り道をせずに済みます。
エラーメッセージが「認証情報が取得できない」という言い方なので、つい認証まわりを疑ってしまいますが、実際は設定ファイルの後始末の問題でした。
ちなみにまた別の話ですが、このあと本番環境へのデプロイでも別の問題に遭遇しました。

