Развертывание стека докеров приводит к "Нет такой ошибки образа"

Я использую 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 на своих виртуальных машинах, но проблема не была решена.

Другие вопросы по тегам