メインコンテンツまでスキップ

OCI Functionsデプロイ時に「docker-credential-pass」が使えない問題の解決

· 約3分

この記事では、OCI Functionsへデプロイする際に遭遇した「docker-credential-pass がユーザー名にスラッシュを含むと動作しない」問題の原因と、Issueにある修正を取り込んで動作させた手順をまとめます。

原因?

https://github.com/docker/docker-credential-helpers/issues/162

ユーザー名にスラッシュを含む場合、正常に動作しない

解決策

Issuesにある解決策でビルドしてみる

  • 修正済みファイル: private-tools/docker-credential-helpers/pass/pass.go

修正後の流れ

パスワードストア内の古いdocker-credential-helpersエントリを削除します。
|| true を付けることで、該当がなくてもスクリプト全体が失敗しないようにしています。

# ゴミ削除
$ pass rm -rf docker-credential-helpers/$REG_B64 || true
# Dockerログアウト
$ docker logout nrt.ocir.io

Docker の設定で credsStorepass に設定されていることを確認します。
これは、 Docker が認証情報を外部ストア(この場合は pass)に委任することを意味します。

# Docker 設定ファイルの確認
$ cat ~/.docker/config.json
{
"credsStore": "pass"
}

pass は GPG を使ってパスワードを暗号化するため、使用可能な GPG 鍵を確認し、pass init でパスワードストアを初期化します。

# GPG 鍵の確認
$ gpg --list-secret-keys
# パスワードストアの初期化
$ pass init <GPG_KEY_ID>

GPG エージェントを起動して、鍵のキャッシュやパスフレーズ入力を扱えるようにします。

$ gpgconf --launch gpg-agent

Docker にログインして、認証情報が pass に保存されることを確認します。 以下の例では、OCI Functions のコンテナレジストリ nrt.ocir.io (東京リージョン)にログインしています。

# Docker ログイン
$ docker login nrt.ocir.io
Username: <ネームスペース>/example-email@nikkomaple.net
Password: ****************
Login Succeeded

Login Succeeded と表示されれば、認証情報は Docker によって保持され、pass に保存されるはずです。

(参考) 取得した認証情報を確認

pass から正しく認証情報が取得できるか確認します。 Username にスラッシュを含む状態で正しく格納されていることが確認できます。Secret は保存されたパスワードです。

$ echo nrt.ocir.io | docker-credential-pass get
{"ServerURL":"nrt.ocir.io","Username":"<ネームスペース>/example-email@nikkomaple.net","Secret":"****************"}

この記事が同じ問題で困っている人の助けになれば幸いです。

コメント

コメントはまだありません