Docker Compose Behälter ausgeführt
Ich will einen Dienst starten, mit docker-verfassen und halten Sie den Behälter laufen, so kann ich seine IP-Adresse über 'Andockfenster ' inspizieren'. Der container aber immer beendet direkt nach dem Start.
Versuchte ich add " - Befehl: ["sleep", "60"]" und andere Dinge, um die docker-Komponieren.yml, aber sobald ich die Zeile mit "Befehl:..." ich kann nicht rufen "Andockfenster" -Komponieren bis" wie bekomme ich die Meldung "Cannot start-container ..... System-Fehler: ungültiges Zeichen 'k' auf der Suche für Anfang Wert"
Ich auch versucht, indem Sie "CMD sleep 60" und so weiter, um das Dockerfile sich aber diese Befehle scheinen nicht ausgeführt zu werden.
Gibt es eine einfache Möglichkeit, halten Sie den Behälter am Leben oder zum beheben eines meiner Probleme?
BEARBEITEN:
Hier ist der Compose-Datei, die ich ausführen möchten:
version: '2'
services:
my-test:
image: ubuntu
command: bash -c "while true; do echo hello; sleep 2; done"
Es arbeitet fein, Wenn ich dieses mit docker-Komponieren unter OS X, aber wenn versuche ich das gleiche unter Ubuntu 16.04, es gibt mir die obige Fehlermeldung.
Wenn ich versuche den Ansatz mit dem Dockerfile, das Dockerfile sieht wie folgt aus:
FROM ubuntu:latest
CMD ["sleep", "60"]
Die nicht scheinen, etwas zu tun
EDIT 2:
Ich muss mich korrigieren, stellte sich heraus, es war das gleiche problem mit dem Dockerfile und die docker-Komponieren.yml:
Jedes mal, wenn ich hinzufügen entweder "CMD ...", um das Dockerfile ODER hinzufügen " - Befehl ..." zu verfassen-Datei bekomme ich obige Fehlermeldung mit dem ungültigen Zeichen. Wenn ich entfernen Sie die beiden Befehle, es funktioniert einwandfrei.
- Bitte geben Sie die docker-Komponieren.yml, Dockerfile, und alle Skripts, die Sie versuchen zu Debuggen.
- Eine Verwandte Diskussion, für Interessierte: workflow-Entwicklung für server und client mit Docker Compose?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Halten einem container ausgeführt, wenn Sie starten Sie es mit
docker-compose
verwenden Sie den folgenden Befehlcommand: tail -F anything
Damit Ihre docker-Komponieren.yml wird
und Sie können ausführen eine shell zu bekommen, in den Behälter mit dem folgenden Befehl
docker exec -i -t composename_my-test_1 bash
wo
composename
ist der name, derdocker-compose
stellt Ihren Behälter.exit
zurück zu Ihrem host-Maschine. Wenn Sie auf Ihrem host, dann stoppen Sie den container mit Docker (docker stop composename_my-test_1
) oder Docker Compose (docker-compose stop
).docker ps -a
den status des Behälters zeigtRestarting (0) 5 seconds ago
und wenn ich versuchedocker exec -it data-quality-test-db-sqlite sh
es sagtError response from daemon: Container [...] is restarting, wait until the container is running
Basierend auf der Kommentar von @aanand auf GitHub Aug 26, 2015, könnte man
tail -f /dev/null
im Andockfenster-verfassen Sie zu halten Sie den Behälter läuft.docker-Komponieren.yml Beispiel
, Warum dieser Befehl?
Der einzige Grund für die Wahl dieser option war, dass es bekam eine Menge Daumen nach oben auf GitHub, aber die höchsten gestimmt Antwort bedeutet nicht, dass es die beste Antwort. Der zweite Grund war eine pragmatische, eine, wie Probleme gelöst werden mussten, so schnell wie möglich durch zu Fristen.
docker-compose.yml
docker-compose up -d
vom terminaldocker ps
um die container-id oder namedocker inspect $container_id
docker-compose exec ubuntu /bin/bash
oderdocker-compose exec ubuntu /bin/sh
docker-compose down
Hier ein kleines bash-Skript (
my-docker-shell.sh
) zu erstellen, die docker compose-Datei, führen Sie den container, login auf den container, und dann schließlich die Bereinigung der docker-container und docker compose-Datei, wenn Sie sich Abmelden.Können Sie
tty
- Konfiguration option.Im Dockerfile kann man mit dem Befehl:
Als der Kommentator gesagt, wir müssten sehen, das Dockerfile in Frage, um Ihnen eine vollständige Antwort, aber dies ist ein sehr häufiger Fehler. Ich kann so ziemlich garantieren, dass der Befehl, den Sie versuchen zu laufen, beginnt ein Prozess im hintergrund. Das könnte der Befehl, den Sie ausführen würden, in nicht-Docker Situationen, aber es ist die falsche Sache zu tun, in einem Dockerfile. Zum Beispiel, wenn das, was Sie ausführen, ist in der Regel definiert als ein system, service haben, benutzen Sie vielleicht so etwas wie "systemctl start". Das würde beginnen, den Prozess in den hintergrund, was nicht funktionieren wird. Sie müssen die Ausführung des Prozesses im Vordergrund, so dass der gesamte Prozess blockiert werden.
Okay, ich fand mein Fehler. Im Dockerfile für das Bild verwendet komponiere, habe ich angegeben, dass das Basis-image sollte ubuntu:neueste, aber ich habe bereits ein Bild entworfen, als ubuntu von mir und das Bild hat nicht funktioniert. Also ich habe nicht mit dem original-ubuntu Bild, sondern eine beschädigte version von meinem eigenen Bild, das auch als ubuntu.