Холодный апгрейд docker-контейнера из нового образа

Обзор

В случаях, когда обновление через API невозможно, необходимо провести операцию апгрейда с заменой docker-образа и пересозданием контейнера.

Все данные, сохраненные в БД, а также файлы и каталоги в волюмах на хосте, остаются нетронутыми, и после запуска новой версии системы сохраняются и используются.

Процедура апгрейда

Шаг 1. Выяснить текущее имя контейнера с платформой.

Это имя формата "era<Postfix>", заданное при установке системы или при прошлом апгрейде.

Обнаружить его можно, выполнив команду:

docker ps -a

и найдя активный контейнер с указанным форматом имени.

Шаг 2. Сгенерировать строку запуска контейнера.

Для этого выполнить скрипт из инсталлятора - gen_container_cmd_ssh.sh

bash gen_container_cmd_ssh.sh --user=era --host=192.168.0.1 --port=22

Скрипт подключится к серверу и отобразит список контейнеров:

Please, answer some questions about installed instance.

Select container (or enter custom):
     1	era_11
     2	postgres

необходимо указать номер контейнера для которого нужно сгенерировать команду (в примере: 1), после чего будет сгенерирована команда, например:

1
2025.04.18 15:36:51. GenerateCmd. Start script for generate start command for existing era container
2025.04.18 15:36:51. GenerateCmd. Start generate cmd for container: era_11
2025.04.18 15:36:51. GenerateCmd. Command:
docker run --name=era_11 \
           --volume=/mnt/ssd1/era/local:/var/lib/era_files/local:rprivate \
           --volume=/mnt/hdd1/era/era_globalshare:/var/lib/era_files/globalshare:rprivate \
           --volume=/mnt/ssd1/era/rectemp:/var/lib/era_files/rectemp:rprivate \
           --volume=/mnt/ssd1/era/lib:/var/lib/era:rprivate \
           --volume=/mnt/hdd1/era/syncroot:/var/lib/era_files/syncroot:rprivate \
           --volume=/mnt/hdd1/era/logstore:/var/lib/era_files/logstore:rprivate \
           --volume=/mnt/hdd1/era/era_recpath:/var/lib/era_files/recpath:rprivate \
           --volume=/mnt/hdd1/era/era_siteshare:/var/lib/era_files/siteshare:rprivate \
           --volume=/mnt/hdd1/era/supv:/etc/supervisor/conf.d:rprivate \
           --volume=/mnt/ssd1/era/log:/var/log/era:rprivate \
           --cap-add=NET_ADMIN \
           --network=host \
           --restart=unless-stopped \
           --tty \
           --detach=true \
           era:v.1

Запомнить сгенерированную длинную команду, она понадобится в пункте 5.

ВАЖНО! Проверить в полученной команде наличие параметра "--restart unless-stopped". Без него контейнер не стартанет после будущего обновления.

Шаг 3. Загрузить новый образ

docker load -i <ImageFileName>

заменив "<ImageFileName>" на имя docker-образа с новой версией. Образ имеет имя формата "era_<VERSION>_docker.tar.gz".

Шаг 4. Остановить текущий контейнер

docker container stop <CurrentContainerName>

Шаг 5. Запустить новый контейнер

Выполняем команду из пункта 2, заменив имя контейнера на новое. Например, если оригинальная команда была:

docker run --name era<Postfix1> ...

то она становится:

docker run --name era<Postfix2> ...

Новое имя контейнера необходимо для возможности быстрого отката на предыдущую версию. Второй контейнер с тем же именем не может быть создан и запущен. После запуска и проверки корректности состояния предыдущий контейнер можно удалить.

Шаг 6. Проверить часовой пояс внутри контейнера

Для этого необходимо проверить настройку мастер домена timezone (domain.settings.timezone) и при необходимости указать нужный часовой пояс, после чего перезагрузить систему (или контейнер)