Docker登录授权令牌

55

我正在尝试从~/.docker/config.json文件中获取docker login的授权信息。 但是我在config.json文件中看不到auth令牌。 以下是我的docker版本。

docker version
Client:
 Version:      17.03.1-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Tue Mar 28 00:40:02 2017
 OS/Arch:      darwin/amd64

Server:
 Version:      17.03.1-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Fri Mar 24 00:00:50 2017
 OS/Arch:      linux/amd64
 Experimental: true

当我运行cat ~/.docker/config.json时,我能看到的是什么。
cat .docker/config.json
{
    "auths": {
        "https://index.docker.io/v1/": {}
    },
    "credsStore": "osxkeychain"
}%

根据 Codeship 文档, 我应该看到:
{
    "auths": {
        "https://index.docker.io/v1/": {
            "auth": "auth_key",
            "email": "email"
        }
    }
}

我能否禁用在密钥链中存储我的授权密钥?

我真的需要获取auth_key,该如何获取?

谢谢


最简单的解决方法是在Ubuntu内安装旧版本的Docker并在其中生成令牌。虽然这种方法不太美观,但它确实有效。 - Sergey Moiseev
请检查您的钥匙串访问应用程序以获取匹配的密钥。 - Jordan
7个回答

105

Auth就是一个base64编码的“用户名:密码”字符串。您可以使用以下命令获取它:

echo -n 'username:password' | base64

2
我认为在Mac OS上生成认证令牌的最简单方法是使用默认情况下将Docker凭据存储在Mac OS钥匙串中的方法... - Przemek Nowak
3
根据base64的实现,您可能需要使用-w标志禁用换行:base64 -w 0 - Romain

25

如果您正在使用Kubernetes,并且需要用于创建注册表密码,只需运行:

kubectl create secret docker-registry --dry-run=true docker-regcred \
--docker-server=https://index.docker.io/v1/ \
--docker-username=xxx \
--docker-password=xxx \
--docker-email=yourmail@yourdomain.com \
--namespace=xxx \
-o yaml > docker-secret.yaml

这将创建docker-secret.yaml,其中包含您的JSON。 如果您不包括--dry-run=client-o yaml > docker-secret.yaml,它将创建k8s secret。


7
请注意,这将会将您的密码暴露在您的 shell 历史记录和 kubectl 会话中... - flurdy
4
“--dry-run=true已经被弃用(布尔值),可以替换为--dry-run=client。” 更改后仍然可用。 - mjwrazor

11

使用凭据存储库比将base64编码的凭据存储在config.json文件中更安全。在您的情况下,Docker正在使用Mac OS的本机键链(即osxkeychain)作为凭据存储库。

现在有一个从osxkeychain获取凭据的问题,您可以使用docker-credential-helpers

获取凭据的步骤(在终端中):

  1. 下载最新版本。
  2. 解压缩并将其移动到/usr/local/bin或将其路径添加到$PATH变量中,以便您可以全局访问它。
  3. 在终端中执行此命令echo "<server-url>" | docker-credential-osxkeychain get。如果您想查找server-url,请使用此命令docker-credential-osxkeychain list

在Go代码中获取凭据:

package main
import ( "fmt"
osx "github.com/docker/docker-credential-helpers/client" )
func main() {
p := osx.NewShellProgramFunc("docker-credential-osxkeychain")
creds, err := osx.Get(p, "server-url") if err != nil { fmt.Println(err) }
fmt.Printf("获取用户`%s`在`%s`上的凭证,密钥为`%s`\n", creds.Username, creds.ServerURL, creds.Secret) }

虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。- 来自审查 - zgue
@zgue 感谢您的评论,我详细阐述了我的答案。 - dark_shade

10

我也遇到了这个问题,我通过删除JSON文件中的"credsStore"键来解决它。下次运行docker login时,它会给我一个警告,但会将授权令牌保存到该文件中。

这是我的docker版本:

$ docker version
Client: Docker Engine - Community
 Version:           19.03.4
 API version:       1.40
 Go version:        go1.13.3
 Git commit:        9013bf5
 Built:             Wed Oct 30 21:32:58 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.4
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.10
  Git commit:       9013bf583a
  Built:            Fri Oct 18 15:55:51 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

8
使用 macOS,您需要编写一个 config.json 文件,模板如下所示:
{
    "auths": {
        "hub.xxx.com": {
            "username": "xxx",
            "password": "xxx",
            "email": "xxx",
            "auth": "base64(username:password)"
        }
    }
}

OP知道他需要编写一个配置文件。他正在询问如何在进行docker登录时自动写入配置文件。 - user4209634


2

我的问题得到解决,只需要删除config.json文件并重新登录即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接