コンテナレジストリを使用して認証する
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
コンテナレジストリを使用して認証するには、以下を使用できます:
- GitLabのユーザー名とパスワード(2FAが有効な場合は使用できません)
- パーソナルアクセストークン
- デプロイトークン
- プロジェクトアクセストークン
- グループアクセストークン
- GitLab CLI。
トークンベースの認証方式に必要な最小限のスコープ:
- 読み取り(プル)アクセスの場合、
read_registryである必要があります - 書き込み(プッシュ)アクセスの場合、
write_registryおよびread_registryである必要があります
コンテナレジストリで認証する際には、管理者モードは適用されません。管理者モードが有効になっている管理者が、admin_modeスコープなしでパーソナルアクセストークンを作成した場合、管理者モードが有効になっていても、そのトークンは機能します。詳細については、管理者モードを参照してください。
ユーザー名とパスワードで認証する
GitLabのユーザー名とパスワードを使用して、コンテナレジストリで認証できます:
docker login registry.example.com -u <username> -p <password>セキュリティ上の理由から、-pの代わりに--password-stdinフラグを使用することをお勧めします:
echo "<password>" | docker login registry.example.com -u <username> --password-stdin2要素認証(2FA)が有効になっている場合、ユーザー名とパスワードによる認証は使用できません。この場合、トークンベースの認証方法を使用する必要があります。
トークンで認証する
トークンで認証するには、docker loginコマンドを実行します:
TOKEN=<token>
echo "$TOKEN" | docker login registry.example.com -u <username> --password-stdin認証後、クライアントは認証情報をキャッシュします。以降の操作では、指定された操作の実行だけが承認された、JWTトークンを返す認証リクエストを行います。トークンは引き続き有効です:
GitLab CI/CDを使用して認証する
CI/CDを使用してコンテナレジストリで認証する場合、以下を使用できます:
CI_REGISTRY_USERCI/CD変数。この変数は、コンテナレジストリへの読み取り/書き込みアクセス権があるジョブごとのユーザーを保持します。そのパスワードも自動的に作成され、
CI_REGISTRY_PASSWORDで使用できます。echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdinこのトークンは、読み取り(プル)アクセスのみに使用できます。
read_registryスコープがありますが、プッシュ操作に必要なwrite_registryスコープはありません。echo "$CI_JOB_TOKEN" | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdingitlab-ci-tokenスキームを使用することもできます:echo "$CI_JOB_TOKEN" | docker login $CI_REGISTRY -u gitlab-ci-token --password-stdin最小スコープを持つGitLabデプロイトークン:
- 読み取り(プル)アクセスの場合、
read_registry。 - 書き込み(プッシュ)アクセスの場合、
read_registryおよびwrite_registry。
echo "$CI_DEPLOY_PASSWORD" | docker login $CI_REGISTRY -u $CI_DEPLOY_USER --password-stdin- 読み取り(プル)アクセスの場合、
最小スコープを持つパーソナルアクセストークン:
- 読み取り(プル)アクセスの場合、
read_registry。 - 書き込み(プッシュ)アクセスの場合、
read_registryおよびwrite_registry。
echo "<access_token>" | docker login $CI_REGISTRY -u <username> --password-stdin- 読み取り(プル)アクセスの場合、
トラブルシューティング
docker loginコマンドがaccess forbiddenで失敗する
コンテナレジストリは、認証情報を検証するために、GitLab API URLをDockerクライアントに返します。Dockerクライアントは基本認証を使用するので、リクエストにはAuthorizationヘッダーが含まれています。レジストリ設定のtoken_realmで設定された/jwt/authエンドポイントへのリクエストでAuthorizationヘッダーが見つからない場合、access forbiddenエラーメッセージが表示されます。
例:
> docker login gitlab.example.com:4567
Username: user
Password:
Error response from daemon: Get "https://gitlab.company.com:4567/v2/": denied: access forbiddenこのエラーを回避するには、Authorizationヘッダーがリクエストから削除されないようにしてください。たとえば、GitLabの前にあるプロキシが/jwt/authエンドポイントにリダイレクトされている可能性があります。
Dockerクライアントでの認証情報の検証の詳細については、コンテナレジストリアーキテクチャを参照してください。
大きなイメージをプッシュしている場合のunauthorized: authentication required
大きなイメージをプッシュすると、次のような認証エラーが発生する可能性があります:
docker push gitlab.example.com/myproject/docs:latest
The push refers to a repository [gitlab.example.com/myproject/docs]
630816f32edb: Preparing
530d5553aec8: Preparing
...
4b0bab9ff599: Waiting
d1c800db26c7: Waiting
42755cf4ee95: Waiting
unauthorized: authentication requiredこのエラーは、イメージのプッシュが完了する前に認証トークンが期限切れになった場合に発生します。デフォルトでは、GitLab Self-Managedインスタンスのコンテナレジストリのトークンが期限切れになるのは5分後です。GitLab.comでのトークンの有効期限は15分です。