異なるプライベート Docker レジストリを切り替えるには

プライベート Docker レジストリを使う際、$ docker login コマンドでそのレジストリにログインするワケだが、プライベート Docker レジストリが複数ある場合に、どうやって切り替えるか。

そもそも $ docker login している状況はどこに保持されているのかというと、~/.docker/config.json というファイルに記録されていた。中身はこんな感じ (一例)。

{
  "HttpHeaders": {
    "User-Agent": "Docker-Client/18.09.2 (darwin)"
  },
  "credsStore": "osxkeychain"
}

MacOS 環境で確認したので、credsStore には osxkeychain と記載されていた。つまり「キーチェーンアクセス.app」に認証情報を記録しているのだ。

そこで「キーチェーンアクセス.app」を見てみると「Docker Credentials」という項目があったのだが、記録されている内容は最後に $ docker login を叩いたアカウント情報だけだった。

色々調べたけど、複数の Docker レジストリをサクッと切り替える方法はなく、以下のようにそれぞれの環境に docker login するエイリアスを複数用意するしかなさそうだった。

# dev : 開発環境、みたいなテイ
alias docker-dev='echo '\''xxxxx'\'' | docker login my-docker-registry-dev.io -u my-user-name --password-stdin'
# prd : 本番環境、みたいなテイ
alias docker-prd='echo '\''yyyyy'\'' | docker login my-docker-registry-prd.io -u my-user-name --password-stdin'

いつものとおり、シングルクォートを '\'' とエスケープしている。ただ docker login コマンドを叩いているだけ…。

コレを ~/.bashrc にでも書けば良いが、パスワードがベタ書きになってしまう。どこかにパスワードを記載したファイルを置いておいて cat するとか、docker login コマンドを叩くだけの独自コマンドを別途作ってそこに逃がすか、といったところか。

とりあえずこうしておけば、開発環境に Docker イメージを Push する際は $ docker-dev$ docker push と呼べば良いことになる。楽チン。