Чтобы получить чистый эффект от этого, вы должны:
Напишите Dockerfile
, который выполняет работу по установке вашего приложения в нетронутом контейнере Docker (запуск docker build
сделает из него образ)
Отметьте это Dockerfile
в вашем git-хранилище вместе с исходным кодом
Настройте некоторую систему CI для перестройки контейнера Docker при каждом изменении и пометьте его каким-нибудь уникальным тегом (временная метка, хэш коммита git, соответствующий тег git) и отправьте его в хранилище
В системах, в которых работают контейнеры, 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
»).