Развертывание стека докеров приводит к "Нет такой ошибки образа"
Я использую Docker Swarm и хотел бы развернуть сервис с docker-compose
, Мой сервис использует собственное изображение под названием myuser/myrepo:mytag
что я успешно развернул в Docker-Hub в частном хранилище.
Мой docker-compose выглядит так:
version: "3.3"
services:
myservice:
image: myuser/myrepo:mytag
ports:
- "8080:8080"
Перед выполнением я успешно вытащил изображение с помощью: docker pull myuser/myrepo:mytag
Когда я бегу docker stack deploy -c docker-compose.yml myapp
Я всегда получаю ошибку: "No such image: myuser/myrepo:mytag"
,
Интересно, что для запуска одного и того же файла используются только: docker-compose up
(т.е. без режима роя) все работает нормально и служба запускается.
Я действительно не понимаю, почему это не удается? Я уже пытался очистить докер с docker system prune
а затем переполнить мой образ, безуспешно.
7 ответов
Уже нашел решение. Мое изображение размещено в частном хранилище. Помимо менеджера роя (где я выполнял команды), у меня был работающий работник роя.
Когда я побежал docker stack deploy -c docker-compose.yml myapp
Докер развернул сервис на рабочем узле (а не на узле менеджера, как я думал). На рабочем узле у докера не было учетных данных для извлечения образа из частного хранилища. Следовательно, чтобы исправить это либо передайте флаг --with-registry-auth
(который отправляет учетные данные для хранилища на рабочий узел) или убедитесь, что служба развернута на узле, где присутствует образ.
Смотрите: https://docs.docker.com/engine/reference/commandline/deploy/
Я хочу добавить еще один сценарий, который приводит к тому же результату (сообщению об ошибке), чтобы люди не бились головой о стену.
Другая возможность заключается в том, что вы пытаетесь развернуть образ с незащищенным реестром, но забыли отредактировать
daemon.json
на сервер вытягивая образ.
Если это так, пусть этот ответ послужит напоминанием; и сэкономить ваше время.
Для меня проблема заключалась в токене авторизации gitlab ($CI_REGISTRY_USER, $CI_REGISTRY_PASSWORD), который действителен при развертывании на мастере, но недействителен для рабочих, поскольку задание gitlab завершено.
Что касается меня, я боролся с образом, который я развернул в новом реестре, который я настроил в своем рое. Я обновлял стек с помощью Portainer.
Я настроил все необходимые сертификаты и логины на всех узлах и убедился, что загрузил образ, используя следующие команды:
curl -X GET https://myregistry:5000/v2/_catalogcurl -X GET https://myregistry:5000/v2/{image}/tags/list
Что бы я ни пытался, у меня всегда отображалась ошибка «Нет такого изображения» в экземплярах службы.
В последней отчаянной попытке я создал службу (без файла компоновки), используя точно такой же URL-адрес для моего изображения, что и раньше, и это сработало, т.е. докер нашел изображение и запустил службу! Дальнейшие попытки использовать файл компоновки работали правильно для этого и всех других новых изображений.
Странный.
Еще одна вещь, о которой следует знать: дисковое пространство на узле роя. У меня закончилось место на диске, и это выдавало непрозрачную ошибку.
Еще одна проблема, которая может вызвать точно такую же ошибку в случае использования частного регистра, работающего на узле-менеджере роя. Убедитесь, что вы запускаете реестр как СЕРВИС, а не просто как контейнер! Пусть это сэкономит вам время!
У меня была аналогичная проблема на Mac, когда я находился за корпоративным брандмауэром.
Я смог решить только после подключения напрямую к Интернету.
Просто для обновления, пока я нахожусь в VPN, я могу получить доступ к Интернету без каких-либо настроек прокси-сервера и могу загружать (докеры) изображения просто с docker run
. Проблема только сdocker-compose
.
Я попытался изменить сервер имен на 8.8.8.8 в resolv.conf на своих виртуальных машинах, но проблема не была решена.