2015-05-01 8 views
6

Ich versuche, die Option COMMAND in Docker komponieren zu bekommen. In meinem aktuellen docker-compose.yml starte ich das Prosodie-Docker-Image (https://github.com/prosody/prosody-docker) und ich möchte eine Liste von Benutzern erstellen, wenn der Container tatsächlich gestartet wird.Docker Kompilieren und Ausführen von Befehl beim Starten des Containers

Die Dokumentation des Containers besagt, dass ein Benutzer mit den Umgebungsoptionen LOCAL, DOMAIN, and PASSWORD erstellt werden kann, aber dies ist ein einzelner Benutzer. Ich brauche eine Liste von Benutzern.

Beim Lesen einiger Dinge im Internet schien es, dass die Befehlsoption i in der Lage sein sollte, Befehle in einem startenden oder laufenden Container auszuführen.

xmpp: 
    image: prosody/prosody 
    command: prosodyctl register testuser localhost testpassword 
    ports: 
     - "5222:5222" 
     - "127.0.0.1:5347:5347" 

Aber das scheint nicht zu funktionieren, überprüft i Behälter läuft docker exec -it <imageid> bash verwenden, aber der Benutzer erstellt wird, nicht.

Kann ich einen Befehl für einen gestarteten Container mit docker-compose ausführen oder gibt es andere Optionen?

+0

Die Befehlsoption überschreibt den Standardbefehl aus dem Andockcontainer, sodass sie nicht für das verwendet werden kann, was Sie möchten. Vielleicht können Sie ein Skript erstellen, das zuerst Ihre Umgebung mit 'docker-compose start' startet und dann' docker exec prosodyctl register ... verwendet, um Benutzer in diesem Container zu erstellen? – Eelco

Antwort

1

Die COMMAND Anweisung ist genau das gleiche wie das, was am Ende eines docker run Befehl übergeben wird, zum Beispiel echo "hello world" in:

docker run debian echo "hello world" 

Der Befehl als Argumente für die ENTRYPOINT des Bild interpretiert wird, die in debians Fall ist /bin/bash. Im Falle Ihres Bildes wird es an this script übergeben. Wenn Sie dieses Skript betrachten, wird Ihr Befehl nur an die Shell übergeben. Ich hätte erwartet, dass jeder Befehl erfolgreich ausgeführt wird, aber der Container wird beendet, sobald der Befehl abgeschlossen ist. Beachten Sie, dass der Standardbefehl in der Dockerdatei auf CMD ["prosodyctl", "start"] festgelegt ist, was vermutlich ein lang andauernder Prozess ist, der den Server startet.

Ich bin nicht sicher, wie Prosody funktioniert (oder sogar was es ist), aber ich denke, dass Sie wahrscheinlich eine Konfigurationsdatei zuordnen möchten, die Ihre Benutzer enthält, oder einen Datencontainer einrichten, um Ihre Konfiguration beizubehalten. Die erste Lösung würde bedeuten, Zugabe von etwas wie:

volumes: 
    - my_prosodoy_config:/etc/prosody 

Zur Docker-compose Datei, wo my_prosody_config ist ein Verzeichnis der Konfigurationsdateien zu halten.

Die zweite Lösung könnte beinhalten zunächst einen Datencontainer zu schaffen wie:.

docker run -v /etc/prosody -v /var/log/prosody --name prosody-data prosody-docker echo "Prosody Data Container" 

(Das Echo sollte abgeschlossen haben, Sie mit einem gestoppten Behälter zurückbleibt, die Volumina einrichten für die config und Protokolle hat nur sicher, dass Sie nicht docker rm dies durch Zufall)

Dann in der docker-compose-Datei hinzufügen:

volumes_from: 
    - prosody-data 

Hoffentlich können Sie dann Benutzer hinzufügen, indem Sie docker exec wie zuvor ausgeführt, dann prosodyctl register an der Befehlszeile ausführen. Dies hängt jedoch davon ab, wie sich Prosodie und Bild verhalten.

1

CMD ist direkt in Verbindung mit ENTRYPOINT in Docker (siehe this Frage für eine Erklärung). Wenn Sie also einen von ihnen ändern, müssen Sie auch prüfen, wie sich dies auf den anderen auswirkt.Wenn Sie sich die Dockerfile ansehen, werden Sie sehen, dass der Standardbefehl ist, Prosodie durch CMD ["prosodyctl", "start"] zu starten. entrypoint.sh übergibt diesen Befehl gerade, wie Adrian erwähnte. Ihr Befehl überschreibt jedoch den Standardbefehl, so dass Ihr Prosodie-Dämon nie gestartet wird. Vielleicht möchten Sie etwas wie

xmpp: 
    image: prosody/prosody 
    command: sh -c prosodyctl register testuser localhost testpassword && prosodyctl start 
    ports: 
     - "5222:5222" 
     - "127.0.0.1:5347:5347" 

stattdessen versuchen. Elegante und irgendwie etwas der Schöpfer (aus dem entrypoint.sh Skript zu urteilen) so etwas wie

xmpp: 
    image: prosody/prosody 
    environment: 
     - LOCAL=testuser 
     - DOMAIN=localhost 
     - PASSWORD=testpassword 
    ports: 
     - "5222:5222" 
     - "127.0.0.1:5347:5347" 

Ihre letzte Frage zu beantworten wäre, beabsichtigt zu haben scheint: nein, es ist nicht möglich (ab sofort) ausführen Befehle auf einem laufenden Container über Docker-Compose. Allerdings können Sie tun dies leicht mit Docker:

docker exec -i prosody_container_name prosodyctl register testuser localhost testpassword 

wo prosody_container_name der Name Ihres Laufbehälter (Verwendung docker ps zur Liste Laufbehälter).