Если я внесу тривиальное изменение в один сервис, нужно ли мне создавать приложение целиком и создавать его новый образ?
Нужно ли заново развертывать все приложение в случае небольшого изменения?
Для каждого шага в Dockerfile Docker генерирует промежуточный контейнер. Если вы используете то же, что и раньше, Docker использует этот кэшированный промежуточный контейнер. Если вы измените команду (например, добавите пакет, скопируете новые строки исходного кода ...), на этом шаге будет создан новый промежуточный контейнер. Каждый шаг после этого запускается в новом промежуточном контейнере, поэтому кэширование невозможно.
Так что да, ты должен. Но вы можете оптимизировать сборку, используя промежуточный контейнер и многоэтапные сборки (см. Ссылки).
Как мне сообщить пользователю об изменении?
Сначала: используйте теги для управления версиями. Это очень помогает. Но как сообщить, проблема вашего варианта использования, а не докер. Это то же самое, что выпуск новой «нормальной» версии программного обеспечения.
Пусть у вас есть CI-Pipeline и вы можете автоматизировать этот шаг. Или у вас есть доступ к вашим системам клиентов и вы можете автоматически развернуть новый контейнер.
если мой клиент не желает создавать контейнер своей базы данных, могу ли я использовать Docker Network для установления соединения с этим внешним SQL-сервером?
Docker Networks для (изолированной) связи между Docker Containers. Вы можете использовать «обычный» способ подключения клиента к внешней базе данных. Возможно, вам придется опубликовать порт за пределами вашего контейнера (см. Ссылки на докер). И помните, что адрес localhost
относится к контейнеру, а не к вашей системе.
Этот пост в блоге может быть полезен для вас:
[1] https://andrewlock.net/caching-docker-layers-on-serverless-build-hosts-with-multi-stage-builds---target,-and---cache-from/
[2]
https://www.busbud.com/blog/going-docker-multi-stage-builds/