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 还支持基于 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,但在共享的信息方面有所不同。
助手始终使用命令中的第一个参数来标识操作。该参数只有三个可能的值:store
、get
和erase
。
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