Podmanでコンテナイメージをpullやpushしようとすると、401認証エラーが発生することがあります。このエラーはレジストリへの認証に失敗したときに出現し、適切な認証情報がないか有効期限切れの状態を示しています。
よくある原因
podman loginを実行していない
Podmanでレジストリからイメージを取得するには、事前に認証を完了する必要があります。ログイン処理を行わずにpullコマンドを実行すると、認証情報がないため401エラーが発生します。特に新しい環境構築時や、別のレジストリを利用する場合に見落とされやすいです。
認証トークンの有効期限が切れている
レジストリが発行した認証トークンには有効期限が設定されていることが多いです。数週間から数ヶ月経過すると、以前ログインした認証情報が無効化されてしまい、401エラーが返されます。
~/.config/containers/auth.jsonの認証情報が古い
Podmanはログイン時の認証情報を ~/.config/containers/auth.json に保存します。このファイルの内容が古い、破損している、または複数のレジストリ情報が混在していると、401エラーが発生することがあります。
解決手順
ステップ1:現在のログイン状態を確認する
まず、どのレジストリに対して認証情報が保存されているか確認します。
# auth.jsonの内容を確認
cat ~/.config/containers/auth.json
ファイルが存在しない場合や、対象のレジストリURLが記載されていなければ、ログインが必要です。
ステップ2:対象のレジストリに再ログインする
次のコマンドでレジストリに対してpodman loginを実行します。レジストリURLは正確に指定してください。
# Docker Hubの場合
podman login docker.io
# プライベートレジストリの場合(例:プライベートGCR)
podman login gcr.io
# ユーザー名とパスワードを聞かれるので入力する
# Username: <your-username>
# Password: <your-password>
ログインが成功すると、認証情報が ~/.config/containers/auth.json に保存されます。
ステップ3:auth.jsonを削除して再ログインする
上記ステップで解決しない場合、auth.jsonを完全に削除した上で再度ログインしてください。この方法で古い認証情報をクリアできます。
# auth.jsonを削除
rm ~/.config/containers/auth.json
# 再度ログイン処理を実行
podman login <レジストリURL>
削除後、新しい認証情報が~/.config/containers/auth.jsonに保存されます。
ステップ4:レジストリURLが正しく指定されているか確認する
pullやpushコマンドを実行する際、指定しているレジストリURLが正確か確認します。レジストリURLが異なると、別のレジストリとして認識され、認証エラーが発生します。
# 正しいレジストリURLでpullを実行
podman pull docker.io/library/ubuntu:latest
# pullが成功することを確認
podman images
ログイン後にpullコマンドを再度実行して、401エラーが解消されたか確認します。
それでも解決しない場合
ファイアウォールやプロキシが認証通信をブロックしていないか確認してください。企業ネットワークではHTTPプロキシ経由でレジストリにアクセスする必要があるケースがあります。Podmanの場合、プロキシ設定は ~/.config/containers/registries.conf で行います。
また、レジストリが要求するスコープ(scope)が限定されている場合、認証トークンの生成時にスコープを指定しなければならないことがあります。詳細はレジストリの公式ドキュメントを確認してください。
免責事項:本記事の内容は、執筆時点の公開情報をもとに作成したものです。ソフトウェアの仕様は予告なく変更されることがあります。最新の情報は各ツールの公式サポートページをご確認ください。本記事の情報を利用した結果生じたいかなる損害についても、著者および運営者は責任を負いかねます。