Копировать / обновить код в Docker-контейнере без остановки контейнера - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть настройка docker-composer, в которой я загружаю исходный код для сервера, скажем, flask api.Теперь, когда я изменяю свой код Python, я должен выполнить следующие шаги:

  1. остановить работающие контейнеры (docker-compose stop)
  2. построить и загрузить обновленный код в контейнер (docker-составить --build)

Это займет немного много времени.Есть ли лучший способ?Как обновить код в запущенном докере, а затем перезапустить сервер Apache, не останавливая весь контейнер?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Вы можете запустить docker build, пока старый контейнер все еще работает, и ваше время простоя ограничено периодом переключения.

Может быть полезно по нескольким причинам установить балансировщик нагрузки впередвашего контейнера.В зависимости от вашего приложения это может быть «тупой» балансировщик нагрузки, такой как HAProxy, или полноценный веб-сервер, такой как nginx, или что-то, что ваш облачный провайдер делает доступным.Это позволяет одновременно запускать несколько копий приложения, возможно, на разных хостах (это помогает для масштабирования и надежности).В этом случае последовательность становится такой:

  1. docker build новое изображение
  2. docker run it
  3. Присоедините его к балансировщику нагрузки (теперь трафик идет на обастарые и новые контейнеры)
  4. Проверка правильности работы нового контейнера
  5. Отсоединение старого контейнера от балансировщика нагрузки
  6. docker stop && docker rm старый контейнер

Если вы не возражаете против более тяжелой инфраструктуры, эта последовательность в основном именно то, что происходит, когда вы изменяете тег изображения в объекте развертывания Kubernetes, но принятие Kubernetes является чем-то существенным.

0 голосов
/ 25 сентября 2018

Существует несколько грязных способов изменить файловую систему запущенного контейнера.Сначала вам нужно найти путь к каталогу, который используется в качестве корневого каталога времени выполнения для контейнера.Запустите docker container inspect id/name.Ищите ключ UpperDir в выводе JSON.Вы можете редактировать / копировать / удалять файлы в этом каталоге.

Другой способ - получить идентификатор процесса, запущенного в контейнере.Перейдите в каталог /proc/process_id/root.Это корневой каталог для процесса, выполняющегося внутри Docker.Вы можете редактировать его на лету, и изменения появятся в контейнере.

...