Как автоматически выдвигать и изменять изображения модифицированного докера? - PullRequest
0 голосов
/ 30 августа 2018

У меня есть образ докера, который я могу запустить на многих серверах с разными параметрами. В образе докера есть git-репозиторий, который нужно извлечь любым способом. Поэтому мне нужно что-то, что:

  1. запустить «главный» образ докера в интерактивном режиме (-it)
  2. вытащить хранилище git в докер
  3. зафиксировать различия контейнера (вызванные git pull)
  4. отправить новый образ в реестр облака Docker
  5. вытащить новый образ на каждом сервере, где докер уже был установлен

некоторые вопросы:

  • эта процедура правильная или есть другие способы?
  • есть ли способ выполнить шаги 1,2, передавая некоторые аргументы команде run, например скрипт bash или что-то еще?
  • когда я делаю docker pull <new image>, нужно ли выключать уже работающий контейнер докера и перезапускать его после завершения операции извлечения, или докер настолько умен, чтобы понять, что ему нужно перезапустить контейнер?
  • Я обнаружил сторожевую башню , которая может обрабатывать обновления контейнера, также удаленно. Я еще не пробовал, но буду.

    EDIT: Я создал 2 сценария. Первое изображение в докере, которое выполняет git pull. Второе вне образа докера, которое будет запущено пользователем или автоматической программой. Этот второй скрипт выполняет:

  • запустить докер в отдельном режиме, получив идентификатор контейнера, который возвращается из команды запуска

  • выполнить первый скрипт с помощью команды docker exec

  • зафиксировать контейнер, используя предыдущий сохраненный идентификатор контейнера

  • вставить новый образ в облачный реестр

  • остановка контейнера

Теперь мне нужно попробовать программу watchtower или найти другие инструменты.

1 Ответ

0 голосов
/ 31 августа 2018

Чтобы получить чистый эффект от этого, вы должны:

  1. Напишите Dockerfile, который выполняет работу по установке вашего приложения в нетронутом контейнере Docker (запуск docker build сделает из него образ)

  2. Отметьте это Dockerfile в вашем git-хранилище вместе с исходным кодом

  3. Настройте некоторую систему CI для перестройки контейнера Docker при каждом изменении и пометьте его каким-нибудь уникальным тегом (временная метка, хэш коммита git, соответствующий тег git) и отправьте его в хранилище

  4. В системах, в которых работают контейнеры, docker stop && docker rm их, затем docker run их с новым теговым изображением

Этот подход имеет два важных преимущества по сравнению с тем, что вы описываете. Во-первых, любой, у кого есть исходный репозиторий, может перестроить именно рабочий образ. (В вашем подходе, если вы случайно потеряете работающий контейнер, вы не сможете воспроизвести то, что было запущено.) Во-вторых, если сборка идет не так, достаточно просто откатиться до запуска предыдущей версии образа, просто изменив вернуться назад.

В частности, если вы спрашиваете «могу ли я запустить что-то вроде bash-скрипта с docker run, чтобы я мог docker commit результат», Dockerfile - это почти то, что вы ищете .

Последний шаг - наименее четкий из них. Вы можете использовать простой инструмент управления кластером, такой как Ansible, чтобы заставить контейнеры работать в некоторых местах; или обновите версию изображения в чем-то вроде YAML-файла Docker Compose, работающего на Docker Swarm; или инструмент сторожевой башни, который вы определили, похоже, может это сделать. Это то, что Kubernetes делает очень хорошо, но это ... инвестиции.

В описываемом вами рабочем процессе есть пара вещей, которые, я бы сказал, явно не передовые практики в производственных средах. Я бы посоветовал вам в принципе никогда не использовать docker commit (docker build довольно прост и дает вам воспроизводимые сборки изображений; даже в контексте вопроса SO «вот мой Dockerfile» гораздо проще описать, чем «я сделал кучу вещи в контейнере, а затем совершил это "). docker exec полезен для отладки, но не должен быть основным способом взаимодействия с контейнерами. Наконец, использование одного и того же имени / тега изображения и фиксация разных изображений под одним и тем же тегом затрудняет откат к более старой версии кода («не используйте тег :latest»).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...