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 还支持基于 Web 的登录流程,该流程无需输入密码即可登录您的 Docker 帐户。对于 Docker Hub,docker login命令默认使用设备代码流程,除非指定了--username标志。设备代码流程是一种安全的登录方式。请参阅使用设备代码验证 Docker Hub 身份

凭据存储

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

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

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

  • D-Bus 密钥服务
  • Apple macOS 密钥链
  • Microsoft Windows 凭据管理器
  • pass

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

配置凭据存储

您需要在$HOME/.docker/config.json中指定凭据存储,以告诉 Docker Engine 使用它。config 属性的值应该是要使用的程序的后缀(即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"
}

如果要存储的密钥是身份令牌,则用户名应设置为<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密码
--password-stdin从 stdin 获取密码
-u, --username用户名

示例

使用基于 Web 的登录验证 Docker Hub 身份

默认情况下,docker login命令使用设备代码流程来验证 Docker Hub 身份。此流程允许您在不输入密码的情况下验证 Docker Hub 身份。您可以改为在 Web 浏览器中访问 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