Команда запуска существующего контейнера
era/scripts/gen_container_cmd.sh восстанавливает по работающему (или остановленному) контейнеру ту команду docker run, которой его можно поднять заново.
bash era/scripts/gen_container_cmd.sh
bash gen_container_cmd_ssh.sh --host=192.168.0.10 --user=user
Зачем это нужно
-
Обновление платформы пересозданием контейнера. Новый образ загружается на сервер вручную, командой снимается строка запуска текущего контейнера — и новый контейнер поднимается из нового образа с теми же параметрами, что были у старого: те же тома, порты, переменные, сеть. Пошаговая процедура — Холодный апгрейд docker-контейнера из нового образа.
-
Контейнер поднят давно, параметры запуска забыты, а перенести его на другой сервер надо.
-
Нужно изменить один параметр — порт, том, переменную — не восстанавливая всю установку.
-
Требуется зафиксировать фактическую конфигурацию: что именно работает сейчас, а не что было задумано.
Команда только читает: она вызывает docker inspect и ничего не меняет.
Как пользоваться
Без аргументов выводится список контейнеров, из которого нужно выбрать:
bash era/scripts/gen_container_cmd.sh
В строке списка кроме имени показан каталог данных контейнера — общий каталог смонтированных в него путей:
Какой контейнер?
1) каталог: /opt/era<постфикс>, контейнер: era<постфикс>
2) каталог: /opt/era<постфикс>/postgresql, контейнер: postgres<постфикс>
По одному имени инстансы не различить, а каталог отвечает на вопрос сразу. Если общего каталога нет — у контейнера только именованные тома docker — в строке остаётся одно имя.
Имя можно задать сразу — ключом или позиционным аргументом:
bash era/scripts/gen_container_cmd.sh --container=era_11
bash era/scripts/gen_container_cmd.sh era_11
Результат печатается на экран и сохраняется рядом с логом в файл <имя>.run.sh.
docker run --name=era_11 \
--volume=/opt/era_11/lib:/var/lib/era:rslave \
--network=host \
--restart=unless-stopped \
--env=STARTTYPE=servinit \
--cap-add=NET_ADMIN \
--detach=true \
era:1.11.0
Что стоит знать о результате
Команда восстанавливается из фактического состояния контейнера, поэтому:
-
она содержит все переменные окружения, включая те, что подставил сам образ;
-
пароли, попавшие в переменные окружения при запуске, окажутся в выводе в открытом виде — файл
.run.shсоздаётся с правами0600, но с экрана его лучше не копировать в общий чат; -
тома перечисляются так, как их видит docker: пути на хосте, а не то, что вы вводили при установке.
Для восстановления всей установки, а не одного контейнера, пользуйтесь файлом ответов — см. era_installer/unattended.adoc#era-installer-unattended.
Права
docker inspect работает без sudo, если пользователь входит в группу docker.
Если не входит, доступ проверяется до всякой работы с docker, и в интерактивном режиме установщик просит пароль, объясняя зачем:
Докеру нужен root: список контейнеров читается через sudo. Введите пароль.
Проверка идёт и перед выбором контейнера из списка, и перед docker inspect по имени из --container: без неё отсутствие прав выглядело бы как отсутствие контейнеров.
В неинтерактивном режиме, где sudo некуда спросить пароль, работа прекращается кодом 3 с одним из трёх сообщений: docker не установлен, демон не отвечает, либо демон отвечает только root — тогда нужен root, членство в группе docker или sudo без пароля.