Токен авторизации для входа в Docker

Я пытаюсь получить docker login авторизацию из ~/.docker/config.json файла. Но я не вижу токен auth в моем файле config.json. Вот моя версия докера.

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, как я могу это получить?

Спасибо


person Gayan    schedule 16.04.2017    source источник
comment
Самый простой способ решить эту проблему — установить где-нибудь старую версию докера внутри Ubuntu и сгенерировать там токен. Не предлагать это в качестве ответа, потому что это уродливо. Но работает.   -  person Sergey Moiseev    schedule 25.04.2017
comment
Проверьте приложение Keychain Access на наличие соответствующего ключа stackoverflow.com/a/59363993/4418836.   -  person Jordan    schedule 16.12.2019


Ответы (6)


Auth — это просто строка «имя пользователя: пароль» в кодировке base64. Вы можете получить его с помощью следующей команды:

echo -n 'username:password' | base64
person Roman Timushev    schedule 14.08.2017
comment
Я думаю, что это самый простой способ создать токен аутентификации на mac os, который по умолчанию хранит учетные данные докера в цепочке ключей mac os... - person Przemek Nowak; 25.11.2017

Использование хранилища учетных данных более безопасно, чем хранение учетных данных в кодировке base64 в config.json файл. В вашем случае докер использует родную связку ключей 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("Got credentials for user `%s` in `%s` with secret `%s` \n", creds.Username, creds.ServerURL, creds.Secret)
}
person dark_shade    schedule 10.10.2018
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. – Из обзора - person zgue; 10.10.2018
comment
@zgue спасибо за обзор, я уточнил свой ответ. - person dark_shade; 11.10.2018

Если вы используете Kubernetes и он вам нужен для создания пароля реестра, просто запустите:

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

Это создаст docker-secret.yaml с вашим JSON. если вы не укажете --dry-run=client и -o yaml > docker-secret.yaml, будет создан секрет k8s.

person NicoKowe    schedule 21.06.2019
comment
Обратите внимание, что при этом ваш пароль будет отображаться в истории вашей оболочки и в сеансе kubectl... - person flurdy; 09.08.2019
comment
--dry-run=true is deprecated (boolean value) and can be replaced with --dry-run=client. Работает после изменения - person mjwrazor; 08.01.2021

У меня тоже была эта проблема; Я исправил это, удалив ключ "credsStore" из этого файла JSON. В следующий раз, когда я запустил docker login, он выдал мне предупреждение, но сохранил токен авторизации в этом файле.

Вот моя версия докера:

$ 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
person ahuff44    schedule 17.12.2019

используя macos, вам нужно написать файл config.json, такой шаблон:

{
    "auths": {
        "hub.xxx.com": {
            "username": "xxx",
            "password": "xxx",
            "email": "xxx",
            "auth": "base64(username:password)"
        }
    }
}
person flynn    schedule 05.05.2019
comment
ОП знает, что ему нужно написать файл конфигурации. Он спрашивает, как автоматически писать в файл конфигурации при входе в докер. - person Lezard; 04.06.2021

Основываясь на ответе от Романа, я создал небольшой вкладыш, который можно легко предоставить пользователям в качестве копии. вставить инструкцию:

echo -en "------\nPlease enter Docker registry login:\nUsername: "; \
    read regusername; \
    echo -n "Password: "; \
    read -s regpassword; \
    echo""; \
    echo -n "Auth Token: "; \
    echo -n "$regusername:$regpassword" | base64; \
    unset regpassword; \
    unset regusername;

Или настоящий однострочный:

echo -en "------\nPlease enter Docker registry login:\nUsername: "; read regusername; echo -n "Password: "; read -s regpassword; echo""; echo -n "Auth Token: "; echo -n "$regusername:$regpassword" | base64; unset regpassword; unset regusername;

Преимущество по сравнению с простой командой base64: она не отображает введенный пароль, поэтому вы не можете найти чистый пароль в истории bash. Он также печатает четкие инструкции для пользователя.

Протестировано на:

  • MacOS в zsh и bash
  • Убунту в Баше
person mozzbozz    schedule 24.02.2021