Ich möchte so etwas tun, wo ich mehrere Befehle nacheinander ausführen kann.
db:
image: postgres
web:
build: .
command: python manage.py migrate
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
links:
- db
docker
yaml
docker-compose
RustyShackleford
quelle
quelle
/bin/bash
sh
stattdessen verwendet:[sh, -c, "cd /usr/src/app && npm start"]
ash
auf alpinen verwenden :)Ich führe Pre-Startup-Inhalte wie Migrationen in einem separaten kurzlebigen Container aus (beachten Sie, dass die Compose-Datei vom Typ '2' sein muss):
Dies hilft, die Dinge sauber und getrennt zu halten. Zwei Dinge zu beachten:
Sie müssen die richtige Startreihenfolge sicherstellen (mit abhängigen_on)
Sie möchten mehrere Builds vermeiden, indem Sie sie beim ersten Mal mit Build und Image markieren. Sie können dann auf das Bild in anderen Containern verweisen
quelle
bash -c
oben vorgehen.Ich empfehle die Verwendung
sh
im Gegensatz zu,bash
da es auf den meisten Unix-basierten Bildern (alpine usw.) leichter verfügbar ist.Hier ist ein Beispiel
docker-compose.yml
:Dadurch werden die folgenden Befehle der Reihe nach aufgerufen:
python manage.py wait_for_db
- Warten Sie, bis die Datenbank fertig istpython manage.py migrate
- Führen Sie alle Migrationen durchpython manage.py runserver 0.0.0.0:8000
- Starten Sie meinen Entwicklungsserverquelle
>
wird verwendet, um eine mehrzeilige Eingabe zu starten (siehe stackoverflow.com/a/3790497/2220370 )Das funktioniert bei mir:
docker-compose versucht, Variablen zu dereferenzieren, bevor der Befehl ausgeführt wird. Wenn Sie also möchten, dass bash Variablen verarbeitet, müssen Sie den Dollarzeichen entkommen, indem Sie sie verdoppeln ...
... sonst erhalten Sie eine Fehlermeldung:
quelle
$${Types}
und$${Client}
. Ich denke, dies wird verhindern, dass Docker Compose diese Variablen interpretiert und nach ihren Werten in der Shell sucht, von der aus Sie Docker Compose aufrufen. Dies bedeutet, dass sie immer noch für Bash verfügbar sind, um sie zu dereferenzieren ( nachdem Docker Ihre.env
Datei verarbeitet hat ).Hier können Sie den Einstiegspunkt verwenden. Der Einstiegspunkt im Docker wird vor dem Befehl ausgeführt, während der Befehl der Standardbefehl ist, der beim Starten des Containers ausgeführt werden soll. Daher führen die meisten Anwendungen im Allgemeinen Setup-Prozeduren in der Einstiegspunktdatei aus und in der letzten erlauben sie die Ausführung des Befehls.
Erstellen Sie eine Shell-Skriptdatei kann wie
docker-entrypoint.sh
folgt sein (Name spielt keine Rolle) mit folgenden Inhalten.Verwenden Sie es in der Datei docker-compose.yml mit
entrypoint: /docker-entrypoint.sh
und registrieren Sie den Befehl alscommand: python manage.py runserver 0.0.0.0:8000
PS: Vergessen Sie nicht,docker-entrypoint.sh
zusammen mit Ihrem Code zu kopieren .quelle
docker-compose run service-name ....
Eine andere Idee:
Wenn Sie wie in diesem Fall den Container erstellen, platzieren Sie einfach ein Startskript darin und führen Sie dieses mit dem Befehl aus. Oder hängen Sie das Startskript als Volume ein.
quelle
#!/bin/bash \n python manage.py migrate \n python manage.py runserver 0.0.0.0:8000
(hässlich online)* UPDATE *
Ich dachte, der beste Weg, einige Befehle auszuführen, besteht darin, eine benutzerdefinierte Docker-Datei zu schreiben, die alles tut, was ich will, bevor das offizielle CMD aus dem Image ausgeführt wird.
docker-compose.yaml:
Dockerfile.mongo:
Dies ist wahrscheinlich der sauberste Weg, dies zu tun.
* ALTER WEG *
Ich habe mit meinen Befehlen ein Shell-Skript erstellt. In diesem Fall wollte ich starten
mongod
und ausführen,mongoimport
aber ein Anrufmongod
hindert Sie daran, den Rest auszuführen .docker-compose.yaml :
start_mongod.sh :
Dieser Gabel-Mongo führt also einen Monogimport durch und tötet dann den abgetrennten Gabel-Mongo und startet ihn erneut, ohne sich zu lösen. Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, eine Verbindung zu einem gegabelten Prozess herzustellen, aber dies funktioniert.
HINWEIS: Wenn Sie unbedingt einige anfängliche Datenbankdaten laden möchten, gehen Sie folgendermaßen vor:
mongo_import.sh
mongo_fixtures / *. json-Dateien wurden mit dem Befehl mongoexport erstellt.
docker-compose.yaml
quelle
Wenn Sie mehr als einen Daemon-Prozess ausführen müssen, wird in der Docker-Dokumentation empfohlen, Supervisord in einem nicht getrennten Modus zu verwenden, damit alle Sub-Daemons auf dem Standard ausgegeben werden.
Bei einer anderen SO-Frage habe ich festgestellt, dass Sie die Ausgabe der untergeordneten Prozesse an stdout umleiten können. Auf diese Weise können Sie die gesamte Ausgabe sehen!
quelle
So führen Sie mehrere Befehle in der Docker-Compose-Datei aus
bash -c
:Quelle: https://intellipaat.com/community/19590/docker-run-multiple-commands-using-docker-compose-at-once?show=19597#a19597
quelle
Verwenden Sie ein Tool wie "Wait-for-It" oder " Dockerize" . Dies sind kleine Wrapper-Skripte, die Sie in das Image Ihrer Anwendung aufnehmen können. Oder schreiben Sie Ihr eigenes Wrapper-Skript, um anwendungsspezifischere Befehle auszuführen. laut: https://docs.docker.com/compose/startup-order/
quelle
Ich bin darauf gestoßen, als ich versucht habe, meinen Jenkins-Container so einzurichten, dass Docker-Container als Jenkins-Benutzer erstellt werden.
Ich musste die Datei docker.sock in der Docker-Datei berühren, da ich sie später in der Docker-Compose-Datei verknüpfe. Sofern ich es nicht zuerst berührt habe, existierte es noch nicht. Das hat bei mir funktioniert.
Dockerfile:
docker-compose.yml:
quelle
versuche es mit ";" um die Befehle zu trennen, wenn Sie sich in zwei Versionen befinden, z
command: "sleep 20; echo 'a'"
quelle