Angabe des laufenden Containers auf der Sicherungsseite über Umgebungsvariablen in der yml-Datei

Vorgeschlagener Plugin: discourse-container-names.git

Was soll erledigt werden?

Ich möchte ein einfaches Plugin, das auf der Sicherungsseite den/die Container-Namen anzeigt, wie folgt (Beispiel):

Der Name des Containers soll aus Umgebungsvariable(n) in der yml-Datei stammen, wie folgt:

Anwendungshinweise:

  1. Der Name des Containers muss aus den Umgebungsvariable(n) stammen, wie im obigen Bild gezeigt (nicht beispielsweise aus docker ps).

  2. Im Fall, dass es einen Daten-Container und einen Anwendungs-Container gibt, wäre es schön, auch den Namen des Daten-Containers angezeigt zu bekommen:

  • Container: app # einfaches Beispiel für einen einzelnen Container
  • Container: socket-only, data # einfaches Beispiel für eine Zwei-Container-Konfiguration
  1. Der Grund dafür ist, dass wir mehrere App-Container betreiben, und ich möchte beim Betrachten der Admin-Seiten, insbesondere der Sicherungsseite (gemäß dem ersten Bild), immer wissen, welcher Container läuft.

Wann muss es erledigt sein?

Jederzeit. Keine Eile. Es scheint ein sehr einfaches Plugin für Discourse-Plugin-Experten zu sein. Es ist nur ein „nice-to-have

Eine großartige Idee, wie wäre es damit, auch die tatsächliche Container-ID hinzuzufügen?

Sie lässt sich von innerhalb des Containers wie folgt ermitteln:
cat /proc/self/cgroup|grep "systemd:/docker"| awk -F/ '{print $3}'|cut -c1-12

Danke, aber eine plattformabhängige Kommandozeilen-Utility im Plugin, um diese Informationen zu erhalten, funktioniert für mich (wie erforderlich) nicht (das Abrufen der Docker-ID über den folgenden Befehl funktioniert in unserer Ubuntu 18.04-Umgebung nicht):

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

#. (keine Ergebnisse)

Selbst dies bringt keine Ergebnisse:

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

#  (keine Ergebnisse)

FYI (aus 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

Das bedeutet, dass die Information (die Zeichenkette, die den Namen des laufenden Containers angibt) aus einer Umgebungsvariable in der yml-Datei abgeleitet werden sollte, um sicherzustellen, dass die Information plattformunabhängig ist und funktioniert, wenn viele Container gleichzeitig laufen.

Zum Beispiel betreiben wir mehrere Discourse-Apps und andere Container gleichzeitig, sodass die Verwendung von docker-cli-Befehlen nicht die genauen Informationen liefert, die wir benötigen (den Namen des laufenden Containers im Web „zum Zeitpunkt der Anfrage“, der durch die Reverse-Proxy-Konfiguration bestimmt wird, nicht durch Docker).

Wir wählen den anzuzeigenden Container aus, indem wir den Namen des Unix-Sockets (oder den exponierten Container-Port) in der Reverse-Proxy-Konfiguration ändern, sodass wir den Container in weniger als einer Sekunde ohne Ausfallzeit wechseln. Das bedeutet, dass der Name des Containers (muss) aus einer Umgebungsvariable in der yml-Datei stammen, um zu 100 % zuverlässig und korrekt zu sein.

Daher meine Anforderung, dass die Zeichenkette (Name des Containers, Container-ID usw.) ausschließlich aus Umgebungsvariablen in der yml-Datei stammen soll.

Für alle, die die Container-ID bevorzugen, könnten sie diese wie folgt zu ihrer Umgebungsvariable hinzufügen (Beispiel):

DISCOURSE_APP_CONTAINER_NAME = 'socket-only (63c52bc571b5)'

oder sogar:

DISCOURSE_APP_CONTAINER_NAME = '63c52bc571b5'
DISCOURSE_DATA_CONTAINER_NAME = 'ca7b55fc5a0c'

und gemäß meinem ursprünglichen Beitrag (so wie wir es verwenden möchten):

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

Welche Zeichenkette (Token) als Identifier (Name, Container-ID oder beides) verwendet wird, hängt von den Anforderungen des Systemadministrators (oder des Unternehmens) ab.

Deshalb habe ich ausdrücklich festgelegt, dass die Information als Umgebungsvariable in der Haupt-yml-Datei der App hartkodiert sein muss (nicht über CLI-Befehle wie docker ps oder andere OS- (plattformabhängige) Befehle).

Ich hoffe, das macht meine Anforderung klarer.

Ich möchte, dass dies plattform- und konfigurationsneutral ist und nicht von CLI-Befehlen oder Systembefehlen abhängt. Wir betreiben Docker für viele andere Apps und nicht nur für Discourse auf unseren Servern (einschließlich Discourse, Dockerisierte LAMP-Apps, private Docker-Registries und mehr, wie Sie am Beispiel-Output von docker ps oben sehen können.).

Du hast absolut recht!

Hallo @RGJ,

nur ein weiterer Gedanke dazu:

Der Sonderfall, in dem das Hårten von Container-Identifikatoren (sei es Container-ID, Name oder beides) als YML-Umgebungsvariablen nicht funktioniert, tritt bei Docker Swarm oder Kubernetes auf (Beispiele); denn wenn Container dynamisch basierend auf Last und/oder Fehlern erstellt werden, funktioniert das Hårten von Umgebungsvariablen in YML nicht (ich nehme das an, habe es aber noch nicht selbst durchgeführt, um mit Autorität darüber sprechen zu können); aber ich bin bereit, vorerst den „einfachen Ansatz