docker push: всегда получаю ошибку authentication required
я делаю свой приватный docker registry.
Для начала я просто поднял его в докере, как написано на их сайте.
docker run -d -p 5000:5000 --restart=always --name registry registry:2
Попробовал - всё локально работает.
Начал навешивать аутентификацию.
Нашел довольно понятную статью и "краткий ответ на вопрос" на стековерфлоу.
скомпилировалв, получил команду для запуска такого docker registry
docker run -d \
-p 5000:5000 \
--restart=always \
--name registry \
-v /DData/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry:2
при этом я заранее создал файл паролей в /DData/auth командой
htpasswd -Bc htpasswd konst
Потом я начинаю пробовать команду docker login, получаю "по башке" загадочнейшим сообщением "Message: Remote error from secret service:"
Читаю про config.json, выхожу на тред на cтековерфлоу и у меня срабатывает магия (а по другому это назвать нельзя)
sudo apt install gnupg2 pass
- и после этого docker загадочным образом начинает логиниться!
для справки: я залез в файл ~/.docker/config.json
и увидел, что там засейвлен какой то пароль, скоре всего, мой:
{
"auths": {
"docker.junecat.ru": {
"auth": "a29uc3*********ZmGF1bX43"
}
}
}
Потом я начинаю химичить с nginx'ом:
создаю виртуальный хост, настраиваю nginx в режиме proxy при помощи такого конфига:
# config for Docker
server {
server_name docker.junecat.ru www.docker.junecat.ru;
location / {
#auth_basic "Administrator’s Area";
#auth_basic_user_file /etc/nginx/htpasswd;
proxy_redirect http://192.168.0.10:5000/ /;
proxy_pass_header Server;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_connect_timeout 5;
proxy_read_timeout 240;
proxy_intercept_errors on;
proxy_pass http://192.168.0.10:5000/;
client_max_body_size 5000M;
}
}
получаю на него lentsencrypt'овский сертификат
sudo certbot --nginx -d docker.junecat.ru -d www.docker.junecat.ru
Казалось бы, всё хорошо: снаружи по запросу
https://docker.junecat.ru/v2/_catalog
я сначала получаю запрос на base auth, а потом, когад аутентификация проведена, вижу пустой список образов:
{"repositories":[]}
Но в само конце меня поджидает большой облом:
я беру hello-world образ, тэгаю его для заливки на свой сервер
docker run hello-world
docker tag hello-world docker.junecat.ru/hello-world
и пытаюсь залить (перед этим я сделал docker login и у меня аутентификация - сохранена)
docker push docker.junecat.ru/hello-world
получаю ошибку authentication required
и всегда, на любую попытку заливки я получаю эту ошибку.
Никакого продвижения после копания в сети.
я уже убил на это чертову уйму времени, и хотел бы довести дело до конца.
Нет и у кого то предположений, как это можно победить?
Заранее большое спасибо!
Дополнение
Самое смешное. Жить то как то надо... взял инструкцию с сайта DO, который я вобще то нежно люблю. Сделал по инструкции, не думая, вроде бы, то же саое. Работает!
Не могу понять пока что, где же я в первый раз накосячил... разве что nginx по разному сконфигурирован?
Ответы (1 шт):
Тут сразу две проблемы.
Первая заключается в том, что proxy_pass передаёт только те заголовки, которые явно указаны в конфигурации. Вы в своей конфигурации не передаёте заголовок Authorization, поэтому к registry запрос приходит неавторизованным.
Ладно, не проблема, можно добавить
proxy_set_header Authorization $http_authorization;
proxy_pass_header Authorization;
После этого nginx начинает передавать-таки креденшиалы пользователя.
Но этого, увы, недостаточно, наступают вторые грабли.
Warning: You cannot use authentication with authentication schemes that send credentials as clear text. You must configure TLS first for authentication to work.
То есть нужно одновременно с REGISTRY_AUTH_HTPASSWD_PATH задавать REGISTRY_HTTP_TLS_CERTIFICATE и REGISTRY_HTTP_TLS_KEY. правда, этот тезис противоречит вашему опыту с DO - в той инструкции нет никаких проблем с передачей креденшиалов по незащищённому каналу, верну?
Я посмотрел на это дело, подумал: на какое имя делать сертификат?
- (а) Если самоподписной
localhost, тоnginxможет заколдобиться, нужно прописывать запрет на проверку сертификата - (б) Если для доменного имени моего реестра, то ... из этого немедленно следует та-а-акой геморрой с обновлением этого сертификата на внутреннем сервере, который не виден из внешней сети.
Поэтому я сразу плюнул и сделал по мануалу на сайте docker-а:
- реестр работает без шифрования и без аутентификации
docker run -itd -p 5000:5000 --name registry -v /var/lib/registry:/var/lib/registry --restart always registry:2 - все сертификаты и пароли хранятся в
nginx. Сертбот автоматически обновляет сертификаты.
Оно сразу заработало.
Единственный геморрой - как добавлять пользователей. У нас этим занимается специально обученная девочка, у которой есть инструкция о добавлении пользователей в Gitlab, Mattermost, Google Suite. Но на инструкции
ssh frontend htpasswd /etc/nginx/auth/docker_registry.htpasswd -cb <user_name> <user_pwd>
её глаза необратимо стекленеют...
