docker login

描述向注册表进行身份验证
用法docker login [OPTIONS] [SERVER]

描述

向注册表进行身份验证。

您可以向拥有凭据的任何公共或私有注册表进行身份验证。拉取和推送镜像可能需要身份验证。其他命令,例如 docker scoutdocker build,也可能需要身份验证才能访问仅限订阅的功能或与您的 Docker 组织相关的数据。

身份验证凭据存储在配置的凭据存储中。如果您使用 Docker Desktop,凭据会自动保存到您操作系统的本地密钥链中。如果您未使用 Docker Desktop,可以在 Docker 配置文件(位于 Linux 上的 $HOME/.docker/config.json 或 Windows 上的 %USERPROFILE%/.docker/config.json)中配置凭据存储。如果您未配置凭据存储,Docker 会将凭据以 base64 编码格式存储在 config.json 文件中。这种方法不如配置和使用凭据存储安全。

docker login 也支持凭据助手来帮助您处理特定注册表的凭据。

身份验证方法

您可以使用用户名和访问令牌或密码向注册表进行身份验证。Docker Hub 还支持基于网页的登录流程,让您无需输入密码即可登录 Docker 帐户。对于 Docker Hub,docker login 命令默认使用设备代码流程,除非指定了 --username 标志。设备代码流程是一种安全的登录方式。请参阅使用设备代码向 Docker Hub 进行身份验证

凭据存储

Docker Engine 可以将用户凭据保存在外部凭据存储中,例如操作系统的本地密钥链。使用外部存储比将凭据存储在 Docker 配置文件中更安全。

要使用凭据存储,您需要一个外部助手程序来与特定的密钥链或外部存储进行交互。Docker 要求助手程序位于客户端主机的 $PATH 中。

您可以从 docker-credential-helpers发行页面下载助手程序。以下凭据存储可使用助手程序

  • D-Bus Secret Service
  • Apple macOS 密钥链
  • Microsoft Windows Credential Manager
  • pass

对于 Docker Desktop,凭据存储已为您安装和配置。除非您想更改 Docker Desktop 使用的凭据存储,否则可以跳过以下步骤。

配置凭据存储

您需要在 $HOME/.docker/config.json 中指定凭据存储,以告知 Docker Engine 使用它。配置属性的值应为您要使用的程序的后缀(即 docker-credential- 之后的部分)。例如,要使用 docker-credential-osxkeychain

{
  "credsStore": "osxkeychain"
}

如果您已登录,请运行 docker logout 从文件中移除凭据,然后再次运行 docker login

默认行为

默认情况下,Docker 在每个平台上寻找本地二进制文件,即 macOS 上的 osxkeychain、Windows 上的 wincred 和 Linux 上的 pass。一个特殊情况是,在 Linux 上,如果找不到 pass 二进制文件,Docker 会回退到 secretservice 二进制文件。如果这些二进制文件都不存在,它会将 base64 编码的凭据存储在 config.json 配置文件中。

凭据助手协议

凭据助手可以是实现凭据助手协议的任何程序或脚本。此协议受 Git 启发,但在共享信息方面有所不同。

助手程序始终使用命令中的第一个参数来标识操作。该参数只有三个可能的值:storegeterase

store 命令从标准输入接收 JSON 有效负载。该有效负载携带服务器地址(用于标识凭据)、用户名以及密码或身份令牌。

{
  "ServerURL": "https://index.docker.io/v1",
  "Username": "david",
  "Secret": "passw0rd1"
}

如果存储的秘密是身份令牌,则 Username 应设置为 <token>

store 命令可以将错误消息写入 STDOUT,如果出现问题,Docker Engine 将显示这些消息。

get 命令从标准输入接收字符串有效负载。该有效负载携带 Docker Engine 需要凭据的服务器地址。此有效负载示例如下:https://index.docker.io/v1

get 命令将 JSON 有效负载写入 STDOUT。Docker 从此有效负载中读取用户名和密码

{
  "Username": "david",
  "Secret": "passw0rd1"
}

erase 命令从 STDIN 接收字符串有效负载。该有效负载携带 Docker Engine 想要移除凭据的服务器地址。此有效负载示例如下:https://index.docker.io/v1

erase 命令可以将错误消息写入 STDOUT,如果出现问题,Docker Engine 将显示这些消息。

凭据助手

凭据助手类似于凭据存储,但充当指定程序来处理特定注册表的凭据。默认凭据存储不会用于涉及指定注册表凭据的操作。

配置凭据助手

如果您已登录,请运行 docker logout 从默认存储中移除凭据。

凭据助手的指定方式与 credsStore 类似,但允许同时配置多个助手。键指定注册表域,值指定要使用的程序的后缀(即 docker-credential- 之后的部分)。例如

{
  "credHelpers": {
    "myregistry.example.com": "secretservice",
    "docker.internal.example": "pass",
  }
}

选项

选项默认值描述
-p, --password密码或个人访问令牌 (PAT)
--password-stdin从 stdin 读取密码或个人访问令牌 (PAT)
-u, --username用户名

示例

使用基于网页的登录向 Docker Hub 进行身份验证

默认情况下,docker login 命令使用设备代码流程向 Docker Hub 进行身份验证。此流程让您无需输入密码即可向 Docker Hub 进行身份验证。您可以访问网页浏览器中的 URL,输入代码,然后进行身份验证。

$ docker login

USING WEB-BASED LOGIN
To sign in with credentials on the command line, use 'docker login -u <username>'

Your one-time device confirmation code is: LNFR-PGCJ
Press ENTER to open your browser or submit your device code here: https://login.docker.com/activate

Waiting for authentication in the browser…

在浏览器中输入代码后,您将使用当前在 Docker Hub 网站或 Docker Desktop 中登录的帐户向 Docker Hub 进行身份验证。如果您未登录,系统会在输入设备代码后提示您登录。

向自托管注册表进行身份验证

如果您想向自托管注册表进行身份验证,可以通过添加服务器名称来指定。

$ docker login registry.example.com

默认情况下,docker login 命令假定注册表侦听端口 443 或 80。如果注册表侦听其他端口,您可以在服务器名称后添加端口号来指定。

$ docker login registry.example.com:1337

注意

注册表地址不应包含 URL 路径组件,只应包含主机名和(可选的)端口。包含 URL 路径组件的注册表地址可能会导致错误。例如,docker login registry.example.com/foo/ 是错误的,而 docker login registry.example.com 是正确的。

此规则的例外是 Docker Hub 注册表,出于历史原因,其地址中可能包含 /v1/ 路径组件。

使用用户名和密码向注册表进行身份验证

要使用用户名和密码向注册表进行身份验证,可以使用 --username-u 标志。以下示例使用用户名 moby 向 Docker Hub 进行身份验证。密码以交互方式输入。

$ docker login -u moby

使用 STDIN 提供密码 (--password-stdin)

要以非交互方式运行 docker login 命令,可以设置 --password-stdin 标志以通过 STDIN 提供密码。使用 STDIN 可防止密码出现在 shell 的历史记录或日志文件中。

以下示例从文件中读取密码,并使用 STDIN 将其传递给 docker login 命令

$ cat ~/my_password.txt | docker login --username foo --password-stdin