Я использую нечто подобное вашему третьему сценарию для моего веб-разработчика, но оно основано на Node. Итак, у меня есть 3 docker -композитные файлы (на самом деле 4, один базовый и , имеющий все общее для других ) для сред разработки, промежуточных и производственных сред.
промежуточных docker - compose config аналогичен производственному config, за исключением SSL, портов и других вещей, которые могут не позволять использовать его локально.
У меня есть отдельный контейнер для каждой службы (например, БД, очередь), а для dev я также иметь дополнительные dev DB и контейнеры очереди в основном для запуска авто-тестов. В среде разработчика все источники монтируются в контейнеры, что позволяет использовать IDE / редактор по выбору за пределами контейнера и видеть изменения внутри.
Я использую supervisor для управления своими работниками внутри контейнер с рабочими и некоторыми командами, чтобы перезапустить мои рабочие вручную, когда мне это нужно. Может быть, у вас может быть что-то похожее на перекомпиляцию / перезапуск вашего Java приложения. Или, если у вас есть представление о том, как организовать обнаружение изменений исходного кода приложения и автоматическую перезагрузку приложения, это может быть лучшим вариантом. Кстати, вы дали мне идею исследовать нечто подобное, подходящее для моего случая.
Для промежуточной и производственной среды мой исходный код включен в соответствующий контейнер с использованием производственного Dockerfile. И у меня есть несколько команд для перезапуска всего содержимого в нужной мне среде, обычно это включает в себя перестройку контейнеров, но из-за кэша Docker это не займет много времени (около 20 секунд). И учитывая, что переключение между средами не является слишком частой операцией, я чувствую себя вполне комфортно с этим.
Production docker -compose config используется только во время развертывания, поскольку он включает SSL, надлежащие порты и имеет некоторые дополнительные производственный материал.
Обновление сведений о перезапуске внутреннего приложения с помощью Supervisor:
Вот как я использую его в своих проектах:
Часть моего Dockerfile с установкой Supervisor:
FROM node:10.15.2-stretch-slim
RUN apt-get update && apt-get install -y \
# Supervisor
supervisor \
...
...
# Configs for services/workers managed by supervisor
COPY some/path/worker-configs/*.conf /etc/supervisor/conf.d/
Это пример одной из конфигураций Supervisor для работника:
[program:myWorkerName]
command=/usr/local/bin/node /app/workers/my-worker.js
user=root
numprocs=1
stopsignal=INT
autostart=true
autorestart=true
startretries=10
В этом примере в вашем случае command
должно запускать ваше приложение Java.
И это пример псевдонимов команд для удобного управления Supervisor извне контейнеров. Я использую Makefile как универсальный исполнитель всех команд, но это может быть что-то еще.
# Used to run all workers
su-start:
@docker exec -t MY-WORKERS-CONTAINER-NAME supervisorctl start all
# Used to stop all workers
su-stop:
@docker exec -t MY-WORKERS-CONTAINER-NAME supervisorctl stop all
# Used to restart all workers
su-restart:
@docker exec -t MY-WORKERS-CONTAINER-NAME supervisorctl restart all
# Used to check status of all workers
su-status:
@docker exec -t MY-WORKERS-CONTAINER-NAME supervisorctl status
Как я уже говорил выше, эти команды Supervisor необходимо запускать вручную, но я думаю, что можно реализовать может быть, другой рабочий на основе Node или какой-то наблюдатель вне контейнера с работниками, которые будут обнаруживать изменения файловой системы для каталога sources и автоматически запускать эти команды. Я думаю, что можно реализовать что-то подобное, используя Java, а также , например или this .
С другой стороны, это нужно делать осторожно, чтобы избежать постоянного перезапуска работников при каждом небольшом изменении.