У меня есть docker-compose.yml
файл, который содержит 4 контейнера: Redis, Postgres, API, рабочий
Во время разработки работника мне часто приходится перезапускать его, чтобы применить изменения. Есть ли хороший способ перезапустить контейнер (например worker
) без перезапуска других контейнеров?
docker
docker-compose
Брайан Чен
источник
источник
Ответы:
Это очень просто: используйте команду:
Вы можете установить время ожидания остановки перед уничтожением контейнера (в секундах)
Обратите внимание, что это перезапустит контейнер, но не перестраивает его. Если вы хотите применить свои изменения и затем перезапустить, взгляните на другие ответы.
источник
docker-compose restart
команды НЕ будут применять какие-либо изменения. «Если вы вносите изменения в своюdocker-compose.yml
конфигурацию, эти изменения не отражаются после выполнения этой команды». Поэтому пользуйтесьdocker-compose up -d --build
. docs.docker.com/compose/reference/restartdocker ps -a
restart
не применяет изменения, даже если вы уже выполнили,docker-compose build <container name>
и это нерабочий / неправильный ответ.Другие ответы на перезапуск одного узла находятся на цели,
docker-compose restart worker
. Это отразит этот контейнер, но не будет включать никаких изменений, даже если вы перестроили его отдельно. Вы можете вручнуюstop
,rm
,create
иstart
, но есть гораздо проще метода.Если вы обновили свой код, вы можете выполнить сборку и перезагрузку за один шаг:
Это сначала восстановит ваши изображения из любого измененного кода, что быстро, если нет изменений, так как кэш используется повторно. И тогда он только заменяет измененные контейнеры. Если ваши загруженные изображения устарели, вы можете добавить команду выше:
Сначала загрузите любые измененные изображения (контейнеры не будут перезапущены, пока вы не выполните команду, подобную приведенной
up
выше). Делать начальную остановку не нужно.И чтобы сделать это только для одного сервиса, выполните команду up или pull с сервисами, которые вы хотите указать, например:
Вот краткий пример первого варианта, Dockerfile структурирован так, чтобы часто изменяющиеся части кода оставались ближе к концу. Фактически требования выдвигаются отдельно,
pip install
поскольку этот файл редко изменяется. И поскольку контейнеры nginx и redis были обновлены, они не были перезапущены. Общее время на весь процесс составило менее 6 секунд:источник
-no-cache
опцией? Скажем, я добавил что-то в свойpackage.json
и нужно повторно,RUN npm install
ноDockerfile
сам по себе не изменилсяCOPY
команду, это автоматически сломает кеш.COPY
команда в вашем Dockerfile.git pull
Обновит файл package.json и кэш сборки будет ломаться , когда докер видит скопировать в другой файл.ADD
вместо,COPY
но, видимо, последний является лучшей практикой, поэтому я пойду на это!ADD
будет иметь тот же результат, что иCOPY
в случае с кешем, но (как указано в ссылке на лучшие практики) большинству не нужны дополнительные возможности, поэтому я даже не буду упоминать об этом.Чтобы перезапустить службу с изменениями, вот шаги, которые я выполнил:
источник
docker-compose up -d --build
и она восстановит все и перезапустит все измененные контейнеры. Нет необходимости сначала останавливаться с временем простоя и отдельными командами создания и запуска.up
завещание воссоздает только тот контейнер, который был изменен и поэтому нуждается в перезапуске.Следующая команда
просто ОСТАНОВИТЕ и НАЧНИТЕ контейнер. т.е. без загрузки каких-либо изменений из docker-compose.xml
STOP похож на спящий режим в ПК. Следовательно, stop / start не будет искать какие-либо изменения, внесенные в файл конфигурации. Для перезагрузки из рецепта контейнера (docker-compose.xml) нам нужно удалить и создать контейнер (аналогично перезагрузке ПК)
Так что команды будут следующими
источник
rm
строки опция-f
удобна (без подсказки) и с текущим докеромcreate
иstart
объединена какup
(таким образом, у нас есть 3 команды, а не 4), аup
опция-d
полезна (выполнение выполняется в фоновом режиме).Перезапустите Сервис с помощью docker-compose file
Вариант использования # 1: если COMPOSE_FILE_NAME - это
docker-compose.yml
и сервис работаетВариант использования № 2: если имя файла
sample.yml
и служба работаетПо умолчанию docker-compose ищет команду,
docker-compose.yml
если мы запускаемdocker-compose
команду, в противном случае у нас есть флаг для указания конкретного имени файла с-f [FILE_NAME].yml
источник
Простая команда «docker» ничего не знает о «рабочем» контейнере. Используйте команду как это
docker-compose -f docker-compose.yml restart worker
источник
Перезапустить контейнер
Если вы хотите просто перезапустить свой контейнер:
docker-compose restart servicename
Думайте об этой команде как о «просто перезапустите контейнер по его имени», что эквивалентно
docker restart
команде.Примечание предостережения:
Если вы изменили переменные ENV, они не будут обновляться в контейнере. Вы должны остановить это и начать снова. Или, используя одну команду
docker-compose up
, обнаружит изменения и заново создаст контейнер.Как упоминали многие другие, если вы изменили
docker-compose.yml
сам файл, простой перезапуск не применит эти изменения.Если вы копируете свой код в контейнер на этапе сборки (при
Dockerfile
использовании командADD
илиCOPY
), каждый раз, когда код изменяется, вам необходимо перестраивать контейнер (docker-compose build
).Соотношение с вашим кодом
docker-compose restart
должно прекрасно работать, если ваш код получает путь, сопоставленный с контейнером, директивой volumedocker-compose.yml
следующим образом:Но я бы порекомендовал использовать прямую перезагрузку кода, которая, вероятно, обеспечивается выбранной вами средой в режиме DEBUG (в качестве альтернативы вы можете искать пакеты с автоматической перезагрузкой на выбранном вами языке). Добавление этого должно избавить от необходимости перезапускать контейнер каждый раз после изменения кода, вместо этого перезагружая процесс внутри.
источник
Ответ здесь говорит об отражении изменений в файле docker-compose.yml.
Но что, если я захочу включить изменения, которые я сделал, в мой код, и я верю, что это станет возможным только после перестройки образа и того, что я делаю с помощью следующих команд
1. остановка докера
2. удаление контейнера докера
3. удаление образа докера
4. снова составьте контейнер
источник