Автоматический вход в Docker через Bash-скрипт
Как предварительно ввести свои учетные данные для команды docker login
в скрипте?
Я использую bash-скрипт, который автоматизирует весь процесс настройки моих пользовательских виртуальных машин и т.д. Однако, когда мне нужно войти в Docker в рамках скрипта, чтобы скачать образы, я получаю следующую ошибку:
Username: FATA[0000] inappropriate ioctl for device
Я использовал следующую команду:
( echo "xxx"; echo "yyy"; echo "zzz" ) | docker login docker.somesite.org
Возможно ли это реализовать без использования и копирования существующего файла .dockercfg
, и как это сделать?
Заранее спасибо.
4 ответ(ов)
Чтобы выполнить команду docker login
в неинтерактивном режиме, вы можете использовать флаг --password-stdin
, позволяющий передать пароль через STDIN
. Это предотвращает сохранение пароля в истории оболочки или логах.
Вот пример, как это можно сделать:
echo $DOCKER_PASS | docker login -u$DOCKER_USER --password-stdin $DOCKER_HOST
В данном случае переменные окружения $DOCKER_PASS
, $DOCKER_USER
и $DOCKER_HOST
представляют собой ваш пароль, имя пользователя и адрес Docker-реестра соответственно.
Когда вы входите в свою частную реестр, Docker автоматически создаёт файл $HOME/.docker/config.json
. Этот файл содержит информацию о ваших учетных данных, так что вы можете сохранить его и скопировать на любой хост, когда вам нужно войти в реестр.
Содержимое файла выглядит следующим образом:
{
"auths": {
"example.com": {
"auth": "xxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
Дополнительно, если вы хотите войти в несколько реестров Docker на одном сервере, просто добавьте другую информацию о авторизации следующим образом:
{
"auths": {
"example.com": {
"auth": "xxxxxxxxxxxxxxxxxxxxxxx"
},
"example1.com": {
"auth": "xxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
Теперь вы можете загружать и выгружать образы с example.com
и example1.com
.
Для случайного прохожего, который может натолкнуться на это решение в поисках способа аутентификации в реестре контейнеров OpenShift (Docker), вы можете использовать следующий пример, чтобы указать URI реестра вместе с учетными данными для входа, используя токен OpenShift:
$ echo "$(oc whoami -t)" | docker login -u $USER --password-stdin \
$(oc get route docker-registry -n default --no-headers | awk '{print $2}')
Login Succeeded
Этот код выполняет три основные операции:
Извлекает токен с помощью команды OpenShift
oc whoami -t
.Определяет URI реестра OpenShift:
$(oc get route docker-registry -n default --no-headers | awk '{print $2}')
Выполняет вход в реестр, используя имя пользователя
$USER
и токен, полученный на предыдущем шаге.
Таким образом, вы сможете легко аутентифицироваться в реестре Docker на OpenShift.
У меня были серьезные проблемы с этим, и хотел добавить, что переменная окружения DOCKER_HOST
имеет особое значение для Docker, так как она определяет сокет демона, с которым он подключается, что может привести к сбоям при попытке входа. Полный список переменных окружения, которые использует Docker, можно найти здесь: https://docs.docker.com/engine/reference/commandline/cli/
Я изменил свои переменные окружения на что-то другое, например, REG_
, и это сработало:
docker login --username $REG_USERNAME --password $REG_PASSWORD $REG_HOST
Обратите внимание, что если вы делаете это в GitLab Runner, нет необходимости использовать флаг --password-stdin
, если вы уже используете маскирование переменных (вы можете его использовать, но нет необходимости).
Ошибка "Слишком длинный список аргументов" для команд rm, cp, mv
Linux: Копирование и создание директории назначения, если она не существует
Прерывание скрипта оболочки при возвращении любой команды ненулевого значения
Как отключить индикатор прогресса в cURL?
Как создать файл в Linux из терминала? [закрыто]