Команда запуска существующего контейнера

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 без пароля.