Ich möchte einen Dienst mit Docker-Compose starten und den Container am Laufen halten, damit ich seine IP-Adresse über 'Docker Inspect' erhalten kann. Der Container wird jedoch immer direkt nach dem Start verlassen.
Ich habe versucht, "Befehl: [" Schlaf "," 60 "]" und andere Dinge zur docker-compose.yml hinzuzufügen, aber wann immer ich die Zeile mit "Befehl: ..." hinzufüge, kann ich "Docker-compose up" nicht aufrufen. Ich erhalte die Meldung "Container kann nicht gestartet werden ..... Systemfehler: Ungültiges Zeichen 'k' sucht nach Wertanfang"
Ich habe auch versucht, "CMD sleep 60" und so weiter zur Docker-Datei selbst hinzuzufügen, aber diese Befehle scheinen nicht ausgeführt zu werden.
Gibt es eine einfache Möglichkeit, den Container am Leben zu erhalten oder eines meiner Probleme zu beheben?
EDIT: Hier ist die Compose-Datei, die ich ausführen möchte:
version: '2'
services:
my-test:
image: ubuntu
command: bash -c "while true; do echo hello; sleep 2; done"
Es funktioniert gut Wenn ich dies mit Docker-Compose unter OS X beginne, aber wenn ich dasselbe unter Ubuntu 16.04 versuche, wird mir die obige Fehlermeldung angezeigt.
Wenn ich den Ansatz mit der Docker-Datei versuche, sieht die Docker-Datei folgendermaßen aus:
FROM ubuntu:latest
CMD ["sleep", "60"]
Welches scheint nichts zu tun
EDIT 2: Ich muss mich korrigieren, es stellte sich heraus, dass es das gleiche Problem mit der Docker-Datei und der Docker-compose.yml war: Jedes Mal, wenn ich entweder "CMD ..." zur Docker-Datei hinzufüge oder "Befehl ..." hinzufüge In der Compose-Datei erhalte ich oben einen Fehler mit dem ungültigen Zeichen. Wenn ich beide Befehle entferne, funktioniert es einwandfrei.
quelle
Antworten:
docker-compose
Verwenden Sie den folgenden Befehl, um einen Container beim Starten am Laufen zu haltencommand: tail -F anything
So wird Ihre docker-compose.yml
Mit dem folgenden Befehl können Sie eine Shell ausführen, um in den Container zu gelangen
docker exec -i -t composename_my-test_1 bash
Wo
composename
steht der Name,docker-compose
der Ihren Containern vorangestellt ist ?quelle
exit
, um zu Ihrem Host-Computer zurückzukehren. Wenn Sie sich auf Ihrem Host befinden, können Sie den Container mit Docker (docker stop composename_my-test_1
) oder Docker Compose (docker-compose stop
) stoppen ./dev/null
wäre besseranything
für den Schwanz Befehl ref. stackoverflow.com/a/48732671/248616Sie können die
tty
Konfigurationsoption verwenden.Hinweis: Wenn Sie Dockerfile für Image und
CMD
in Dockerfile verwenden, funktioniert diese Option nicht. Sie können jedoch dieentrypoint
Option inCMD
der Erstellungsdatei verwenden, mit der die Docker- Datei gelöscht wird.quelle
tail -f /dev/null
. Auf diese Weise kann ich eine containerisierte Entwicklungsumgebung mit einer über angeschlossenen Postgres-Datenbank ausführendocker-compose up
und eine Shell über ein anderes Terminal ausführendocker exec
.tail -f /dev/null
oder erzielttail -f anything
, siehe hier: docs.docker.com/compose/compose-fileBasierend auf dem Kommentar von @aanand auf GitHub vom 26. August 2015 könnte man
tail -f /dev/null
in Docker-Compose verwenden, um den Container am Laufen zu halten.Beispiel für docker-compose.yml
Warum dieser Befehl?
Der einzige Grund für die Wahl dieser Option war, dass sie auf GitHub viele Daumen hoch bekam, aber die Antwort mit der höchsten Stimme bedeutet nicht, dass es die beste Antwort ist. Der zweite Grund war pragmatisch, da Probleme aufgrund von Fristen so schnell wie möglich gelöst werden mussten.
quelle
docker-compose.yml
docker-compose up -d
vom Terminal aus im selben Verzeichnisdocker ps
diese Option aus , um die Container-ID oder den Namen abzurufendocker inspect $container_id
docker-compose exec ubuntu /bin/bash
oderdocker-compose exec ubuntu /bin/sh
docker-compose down
Hier ist ein kleines Bash-Skript (
my-docker-shell.sh
), mit dem Sie die Docker-Erstellungsdatei erstellen, den Container ausführen, sich beim Container anmelden und schließlich den Docker-Container und die Docker-Erstellungsdatei bereinigen können, wenn Sie sich abmelden.#!/bin/bash cat << 'EOF' > ./docker-compose.yml --- version: "3" services: ubuntu: image: ubuntu:latest command: /bin/bash # tty: true ... EOF printf "Now entering the container...\n" docker-compose run ubuntu bash docker-compose down rm -v ./docker-compose.yml
quelle
In der Docker-Datei können Sie den folgenden Befehl verwenden:
quelle
Wie der Kommentator sagte, müssten wir die betreffende Docker-Datei sehen, um eine vollständige Antwort zu erhalten, aber dies ist ein sehr häufiger Fehler. Ich kann so ziemlich garantieren, dass der Befehl, den Sie ausführen möchten, einen Hintergrundprozess startet. Dies ist möglicherweise der Befehl, den Sie in Nicht-Docker-Situationen ausführen würden, aber in einer Docker-Datei ist dies falsch. Wenn das, was Sie ausführen, normalerweise als Systemdienst definiert ist, können Sie beispielsweise "systemctl start" verwenden. Das würde den Prozess im Hintergrund starten, was nicht funktionieren wird. Sie müssen den Prozess im Vordergrund ausführen, damit der gesamte Prozess blockiert wird.
quelle
Nur ein kurzer Hinweis
Ich habe ein einzelnes Bild basierend auf getestet.
golang
Wenn ichdocker-compose down
hier anrufe, bekomme ich Folgendes:Meine Systeminfo:
quelle
Okay, ich habe meinen Fehler gefunden. In der Docker-Datei für das zum Erstellen verwendete Image habe ich angegeben, dass das Basis-Image ubuntu: latest sein soll, aber ich habe zuvor selbst ein Image namens ubuntu erstellt, und dieses Image hat nicht funktioniert. Ich habe also nicht das ursprüngliche Ubuntu-Bild verwendet, sondern eine beschädigte Version meines eigenen Bildes, das auch Ubuntu genannt wird.
quelle