docker login
描述 | 向注册表进行身份验证 |
---|---|
用法 | docker login [OPTIONS] [SERVER] |
描述
向注册表进行身份验证。
您可以向拥有凭据的任何公共或私有注册表进行身份验证。拉取和推送镜像可能需要身份验证。其他命令,例如 docker scout
和 docker 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 启发,但在共享信息方面有所不同。
助手程序始终使用命令中的第一个参数来标识操作。该参数只有三个可能的值:store
、get
和 erase
。
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