Указание запускаемого контейнера на странице резервного копирования через переменные окружения в файле yml

Предлагаемый плагин: discourse-container-names.git

Что именно вы хотите сделать?

Мне нужен простой плагин, который отображает имя (имена) контейнера на странице резервных копий, следующим образом (пример):

Имя контейнера должно браться из переменных окружения в YAML-файле, как показано ниже:

Примечания к реализации:

  1. Имя контейнера должно браться из переменных окружения, как показано на изображении выше (а не, например, из команды docker ps).

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

  • Container: app # пример простого автономного имени
  • Containers: socket-only, data # пример простой конфигурации с двумя контейнерами
  1. Причина в том, что мы запускаем несколько контейнеров приложений, и я хочу всегда знать, какой контейнер запущен, просматривая административные страницы, и в частности страницу резервных копий (см. первое изображение).

Когда это нужно сделать?

В любое время. Не срочно. Это кажется очень простым плагином для экспертов по плагинам Discourse. Это просто «приятное дополнение» для административной страницы резервных копий, и у меня нет мотивации писать его самому, поэтому я с радостью заплачу кому-то разумную сумму за выполнение этой задачи!

Какой ваш бюджет в долларах США, который вы можете предложить за эту задачу?

Не стесняйтесь написать мне в личные сообщения.

Плагин должен быть свободно доступен всему сообществу Discourse на случай, если другие системные администраторы Discourse, работающие с несколькими контейнерами, захотят видеть имя текущего запущенного контейнера на странице резервных копий в административной панели; или для любого, кто хочет видеть имя своего запущенного контейнера (даже в автономном режиме) на странице резервных копий.

Отличная идея, как насчет того, чтобы добавить также реальный ID контейнера?

Его можно получить изнутри контейнера вот так:
cat /proc/self/cgroup|grep "systemd:/docker"| awk -F/ '{print $3}'|cut -c1-12

Спасибо, но использование платформозависимой утилиты командной строки внутри плагина для получения информации не работает (как требуется) в моём случае (получение ID Docker из команды ниже не работает в нашей среде Ubuntu 18.04):

# cat /proc/self/cgroup|grep "systemd:/docker"| awk -F/ '{print $3}'|cut -c1-12

#. (нет результатов)

Даже это не даёт результата:

# cat /proc/self/cgroup|grep "systemd:/docker"

#  (нет результатов)

FYI (из вывода docker ps):

CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS                  PORTS                               NAMES
63c52bc571b5        local_discourse/socket-only     "/sbin/boot"             28 minutes ago      Up 28 minutes                                               socket-only
631fbabedda9        local_discourse/socket-only2    "/sbin/boot"             26 hours ago        Up 26 hours                                                 socket-only2
123743e12208        mysql/mysql-server              "/entrypoint.sh mysq…"   2 days ago          Up 20 hours (healthy)   33060/tcp, 0.0.0.0:6603->3306/tcp   mysql-man
7a145366268c        registry.unix.com/unix:condor   "/run.sh"                6 days ago          Up 20 hours             3306/tcp, 0.0.0.0:8999->80/tcp      unix
3cc0c90c3e3a        registry:2                      "/entrypoint.sh /etc…"   7 days ago          Up 7 days               0.0.0.0:5000->5000/tcp              hubby
ca7b55fc5a0c        local_discourse/data            "/sbin/boot"             2 weeks ago         Up 8 days                                                   data

Это означает, что информация (строка, указывающая имя запущенного контейнера) должна браться из переменной окружения в файле yml. Это обеспечит платформонезависимость и позволит работать корректно при запуске множества контейнеров.

Например, мы одновременно запускаем несколько приложений Discourse и других контейнеров, поэтому использование команд docker-cli не даст нам нужной информации (имя запущенного контейнера, отображаемого в веб-интерфейсе «в данный момент», определяется конфигурацией обратного прокси, а не Docker).

Мы выбираем, какой контейнер отображать, изменяя имя Unix-сокета (или открытого порта контейнера) в конфигурации обратного прокси, что позволяет переключаться между контейнерами менее чем за секунду без простоя. Это значит, что имя контейнера должно (обязательно) браться из переменной окружения в файле yml, чтобы быть на 100% надёжным и точным.

Поэтому я настаиваю на том, чтобы строка (имя контейнера, ID контейнера и т. д.) бралась исключительно из переменных окружения в файле yml.

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

DISCOURSE_APP_CONTAINER_NAME = 'socket-only (63c52bc571b5)'

или даже:

DISCOURSE_APP_CONTAINER_NAME = '63c52bc571b5'
DISCOURSE_DATA_CONTAINER_NAME = 'ca7b55fc5a0c'

а в соответствии с моим первоначальным постом (так, как мы хотим это использовать):

DISCOURSE_APP_CONTAINER_NAME = 'socket-only'
DISCOURSE_DATA_CONTAINER_NAME = 'data'

Какой идентификатор (токен) использовать: имя, ID контейнера или оба — зависит от требований системного администратора (или бизнеса).

Вот почему я специально указал, что информация должна быть жёстко прописана в основном файле yml приложения как переменная окружения (а не получаться через команды CLI, такие как docker ps, или другие команды ОС, зависящие от платформы).

Надеюсь, это проясняет мои требования.

Я хочу, чтобы решение было платформонезависимым и не зависело от конфигурации, а также от команд CLI или системных команд. Мы используем Docker для множества других приложений, а не только для Discourse, на наших серверах (включая Discourse, Docker-контейнеры с LAMP-стеком, приватные Docker-реестры и многое другое, как видно из примера вывода docker ps выше.).

Вы абсолютно правы!

Привет, @RGJ,

Ещё одна мысль по поводу продолжения:

Частный случай, когда жёсткое кодирование идентификаторов контейнеров (будь то ID контейнера, его имя или оба параметра) в виде переменных окружения в YAML-файле может не сработать, возникает при использовании Docker Swarm или Kubernetes (например). Дело в том, что когда контейнеры динамически создаются в зависимости от нагрузки и/или сбоев, жёсткое кодирование переменных окружения в YAML не подойдёт (я так предполагаю, но ещё не занимался этим на практике, чтобы говорить с полной уверенностью). Тем не менее, пока я готов придерживаться «простого подхода» (переменные окружения в YAML).

В любом случае, я ещё не развёртывал Discourse с использованием Swarm или Kubernetes, поэтому мой план — решить эту проблему, когда до неё дойдёт :slight_smile:

Я много думал об этом, и именно поэтому решил, что на данный момент лучшим решением будет использование переменных окружения Discourse, зашитых в YAML-файл(ы).

Это должно быть относительно несложной задачей — взять эти переменные окружения как настройки сайта и отображать их на странице администратора «Резервные копии», как показано в моём простом макете: