Стандартный Docker рабочий процесс состоит из двух частей.
Сначала вы создаете образ:
- Проверьте соответствующее дерево исходных кодов в выбранной вами системе управления версиями.
- Если необходимо, запустите какой-то процесс предварительной сборки (скомпилируйте ресурсы c, создайте файл Java
.jar
, запустите Webpack, ...). - Запустите
docker build
, который использует инструкции из Dockerfile
и содержимое дерева локальных исходных кодов для создания изображения. - При необходимости
docker push
полученное изображение в репозиторий Docker (Docker Hub, что-то в облаке, что-то частное).
Затем вы запускаете контейнер на основе этого образа:
docker run
имя образа из сборки фаза. Если он еще не находится в локальной системе, Docker извлечет его из хранилища для вас.
Обратите внимание, что вам не нужно локальное дерево исходных текстов только для запуска образа; Достаточно иметь изображение (или его имя в хранилище, которое вы можете найти). Точно так же в этом рабочем процессе нет «получить оболочку» или «запустить службу», просто docker run
само по себе должно все поднять.
(В этом смысле полезно думать об изображении одинаково как вы думаете о веб-браузере. Вы не загружаете исходный код Chrome для его запуска и никогда не «получаете оболочку» в своем веб-браузере; он почти всегда предварительно компилируется, и вам не нужен доступ к его источнику, или, если вы это сделаете, у вас есть реальная среда разработки для работы с ней.)
Теперь: представьте, что есть некоторая критическая широко распространенная уязвимость безопасности в некотором основном программном обеспечении, используемом вашим приложением (у OpenSSL была пара, например). Достаточно заметно, что все базовые образы Docker уже обновлены. Если вы используете этот рабочий процесс, обновление вашего приложения очень простое: проверьте исходное дерево, обновите строку FROM
в Dockerfile
до чего-то более нового, перестройте, и все готово.
Обратите внимание, что ни один из этих рабочих процессов не «вносит произвольные изменения в контейнер и фиксирует его». Когда вы вынуждены перестраивать образ на новой базе, вы действительно не хотите находиться в положении, когда исполняемый бинарный файл - это что-то, что кто-то создает вручную, редактируя контейнер, но с тех пор он ушел компании, и нет записи о том, что они на самом деле сделали.
Короче: никогда запустить docker commit
. Хотя docker exec
является полезным инструментом отладки, он не должен быть частью вашего основного рабочего процесса Docker, и если вы регулярно запускаете его для настройки контейнеров или думаете о его написании сценариев, лучше попробовать перенести эту настройку вместо обычного запуска контейнера.