Bewahren Sie den Container auf und verknüpfen Sie ihn mit docker-compose

8

Ich möchte docker-compose verwenden, um zusammen php und mehrere Datenbanken (orientdb, neo4j, usw.) zusammenzustellen. Gehe dann in den Container php und benutze die Shell, um Befehle auszuführen.

Alle meine Container arbeiten einzeln, und wenn ich sie zusammensetze, laufen sie alle. Allerdings kann ich nicht für das Leben von mir herausfinden, wie man den Container php am Leben erhält, damit ich mich zum Testen darauf besinnen kann.

Der Einfachheit halber verwende ich nur eine einzige Datenbank: orient-db.

Meine docker-compose.yml -Datei:

%Vor%

Mein "php" Dockerfile :

%Vor%

Ich habe (unter anderem) versucht:

  • docker-compose up in einem Terminal und dann docker attach in einem anderen
  • aktiviert tty und stdin_open in meiner Compose-Datei
  • mit einem /bin/bash -Befehl
  • Variationen von CMD exec vendor/bin/phpunit -D FOREGROUND

Und ein paar Referenzen, die ich ausprobiert habe:  - Wie behalte Docker Container nach dem Starten von Diensten?  - Ссылка  - Ссылка

Jede Hilfe würde wirklich geschätzt werden.

Danke.

    
Apollo 10.05.2016, 21:07
quelle

3 Antworten

10

So docker-compose ist nur ein Stand-in für den Docker-Engine-Client. Es behält Feature-Parität mit dem Client bei. Um Probleme wie diese zu diagnostizieren, sollten Sie die Verwendung von docker-compose abbrechen, bis Sie mit dem normalen ole-Client arbeiten. Basierend auf Ihren Kommentaren hier und auf der anderen Antwort, klingt es einfach so, als würden Sie keinen Container mit einem Daemon-Prozess im Vordergrund ausführen. Wenn Sie eine interaktive Shell in Docker ausführen möchten, müssen Sie die Flags -it verwenden ( -t weist ein Tty zu und -i initiiert eine interaktive Sitzung). Wenn Sie Docker nicht mit diesen Switches ausführen, wird Ihr Container Sie beim Starten einer interaktiven Shell, z. php -a .

Es ist hilfreich, wenn Sie sich Docker als eine elegante Möglichkeit vorstellen, einen Prozess und nicht eine virtuelle Maschine auszuführen. Es ist keine "Umgebung", die außerhalb der Lebenszeit eines beliebigen Prozesses (und seiner Kinder) existiert. Normalerweise wird PHP von einem Server (z. B. Apache, Nginx usw.) aufgerufen. Was Sie hier andeuten ist, dass Sie einen PHP-Prozess benötigen, um "permanent" zu laufen, so dass Sie in den Container fallen und einige Dinge testen können. Mit Ausnahme der interaktiven Shell ist das nicht möglich, und Sie müssen den Schalter -it verwenden, um einen interaktiven Shell-Prozess in Ihrem Container am Leben zu erhalten. Die wirkliche Antwort hier ist, dass Sie nicht tun können, was Sie hier versuchen (lassen Sie einen PHP-Container laufen), ohne dass ein damit verbundener Daemon / Server-Prozess im Vordergrund läuft. Der Grund dafür ist, dass PHP nicht so funktioniert. Wenn Sie wirklich aus Ihrem PHP-Bild in einen Container gelangen wollen, lassen Sie es einfach in eine Shell fallen:

%Vor%

... Und Sie werden einen Container aus Ihrem PHP-Image starten und eine Shell auf den Container bekommen (die sofort nach dem Beenden der Shell abstürzt). Aber noch einmal, nur von meinem ersten Absatz wiederholend, ist docker-compose nicht der richtige Weg.

    
L0j1k 11.05.2016, 15:42
quelle
5

Wenn Sie mit docker-compose up arbeiten und keine Fehler auf dem Terminal ausgegeben werden, schlägt dies vor, dass der Dienst angehalten wird, weil er fertig ist (im Gegensatz zu einem Fehler).

Eine mögliche Ursache für einen Fehler ist, dass Sie Material an PHP senden (Composer installieren), wodurch das interaktive php-Terminal, das von php:5.6-cli image ausgelöst wird, beendet wird. Um die interaktive PHP-Shell zu starten, fügen Sie am Ende Ihrer Docker-Datei Folgendes hinzu:

CMD ["php", "-a"]

und versuchen Sie es erneut mit docker-compose up

Hinweis: Wenn alles ordnungsgemäß läuft, können Sie docker-compose up -d ausführen, um im Daemon-Modus zu laufen und Ihnen die Kontrolle über Ihr Terminal zu geben (alle stdout + stderr werden im entsprechenden Protokoll des Andock-Containers geloggt) Dateien).

Sie können dann an den Container anschließen, um Ihr Ding zu machen. Ich fand immer, dass docker exec -it <containerID> bash schneller war als docker attach <container id>

Hoffe, das hilft.

    
tgallacher 10.05.2016 23:26
quelle
0

Hatte ein ähnliches Problem mit der Ausführung einer zsh-Shell auf einem Docker-Container, der mit compose ausgeführt wird. Es würde unmittelbar nach dem Start mit dem Exit-Code 0 enden.

@ Spocks Kommentar unter der letzten Antwort ist eigentlich der Schlüssel, zumindest für das, was ich brauche.

Legen Sie den Befehl docker-compose für das Bild fest:

%Vor%

Dadurch wird der Prozess am Leben gehalten, aber es kann auch ordnungsgemäß heruntergefahren werden.

    
SeedyROM 23.10.2017 11:42
quelle