docker login
| 描述 | 认证到注册表 |
|---|---|
| 用法 | docker login [选项] [服务器] |
描述
认证到注册表。
您可以认证到您拥有凭据的任何公共或私有注册表。拉取和推送镜像可能需要认证。其他命令,例如 `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 Secret Service
- Apple macOS 密钥链
- Microsoft Windows 凭据管理器
- 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"
}如果存储的密钥是身份令牌,则应将用户名设置为 `
`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 | 从标准输入获取密码或个人访问令牌 (PAT) | |
-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
通过标准输入提供密码 (--password-stdin)
要以非交互方式运行 `docker login` 命令,您可以设置 `--password-stdin` 标志以通过 `STDIN` 提供密码。使用 `STDIN` 可以防止密码出现在 shell 的历史记录或日志文件中。
以下示例从文件中读取密码,并使用 `STDIN` 将其传递给 `docker login` 命令
$ cat ~/my_password.txt | docker login --username foo --password-stdin