webentwicklung-frage-antwort-db.com.de

docker-Compose, ein Skript ausführen, nachdem der Container gestartet wurde?

Ich habe einen Dienst, den ich durch Rancher per Docker-Compose erreiche. Mein Problem ist, dass ich ein Kennwort festlegen muss, nachdem der Container bereitgestellt wurde.

Rancher-Geheimnisse funktionieren so, dass ich mein Geheimnis einsetze und Rancher ein Volume in meinem Container mit einer Datei mounte, die mein Geheimnis enthält. Ich hatte gehofft, ein Skript ausführen zu können, um dieses Geheimnis zu packen, und es als Passwort in meine Konfigurationsdatei zu setzen.

Ich glaube nicht, dass ich einen Weg finden kann, dieses Geheimnis durch das Dockerfile zu bekommen, da ich nicht will, dass das Geheimnis in Trottel ist, also bleibe ich über Docker-Compose.

Weiß jemand, ob das möglich ist?

8
Blooze

Der Trick besteht darin, den compose COMMAND zu überschreiben, um die erforderliche Init-Aktion auszuführen, bevor der ursprüngliche Befehl aufgerufen wird.

  1. Fügen Sie Ihrem Image ein Skript hinzu, das die Init-Arbeit ausführt, mit der Sie das Kennwort festlegen, die internen Konfigurationsdateien ändern usw. möchten. Lassen Sie uns es init.sh nennen. Sie fügen es Ihrem Bild hinzu.

Dockerfile:

FROM: sourceimage:tag
COPY init.sh /usr/local/bin/
  1. Rufen Sie nun in Ihrer Docker-Compose-Datei dieses Init-Skript auf, bevor Sie die Container-Hauptaktion ausführen.

docker-compose.yml:

services:
  myservice:
    image: something:tag
    ...
    command: /usr/local/bin/init.sh && exec the_original_command_goes_here

Es ist wichtig, exec zu verwenden, bevor Sie den Hauptbefehl aufrufen. Dadurch wird der Befehl als erster Prozess (PID1) installiert, der Signale wie Stop oder Kill empfängt.

1
Alkaline

docker-compose gibt an, wie Container gestartet werden, nicht wie ein vorhandener laufender Container geändert werden soll.

Die Rancher-Dokumentation erwähnt, dass Sie für die standardmäßige Verwendung von Geheimnissen das Geheimnis anhand des Namens im Secrets-Array im docker-compose.yml referenzieren können. 

Der Zieldateiname hat denselben Namen wie der Name des Geheimnisses.
Standardmäßig wird der Zieldateiname als Benutzer-ID und Gruppen-ID 0 und als Dateimodus 0444 erstellt.
Wenn Sie den geheimen Teil auf "true" setzen, wird sichergestellt, dass das Geheimnis bereits erstellt wurde.

Beispiel für einen grundlegenden docker-compose.yml:

version: '2'
services:
  web:
    image: sdelements/lets-chat
    stdin_open: true
    secrets:
    - name-of-secret
    labels:
      io.rancher.container.pull_image: always
secrets:
  name-of-secret:
    external: true

Wie in " So wird ein einzelner laufender Docker-Compose-Container aktualisiert " dargestellt, würde das Aktualisieren eines Containers eine "Build-Kill-Up-Sequenz" beinhalten.

docker-compose up -d --no-deps --build <service_name>
0
VonC