Ich habe eine Docker-Datei , um den MySQL-Server in einem Container zu installieren, den ich dann folgendermaßen starte :
sudo docker run -t -i 09d18b9a12be /bin/bash
Der MySQL-Dienst wird jedoch nicht automatisch gestartet. Ich muss ihn manuell ausführen (aus dem Container heraus):
service mysql start
Wie starte ich den MySQL-Dienst automatisch, wenn ich den Docker-Container ausführe?
Antworten:
Erstens gibt es ein Problem in Ihrem
Dockerfile
:Docker-Images speichern keine laufenden Prozesse. Daher wird Ihr
RUN
Befehl nur während derdocker build
Phase ausgeführt und nach Abschluss des Builds gestoppt. Stattdessen müssen Sie den Befehl geben , wenn der Container gestartet wird die VerwendungCMD
oderENTRYPOINT
Befehle wie folgt:Zweitens benötigt der Docker-Container einen Prozess (letzter Befehl), um weiter ausgeführt zu werden, andernfalls wird der Container beendet / gestoppt. Daher kann der normale
service mysql start
Befehl nicht direkt in der Docker-Datei verwendet werden.Lösung
Es gibt drei typische Möglichkeiten, um den Prozess am Laufen zu halten:
Verwenden Sie den
service
Befehl und hängen Sie danach den Non-End-Befehl antail -F
Dies wird häufig bevorzugt, wenn ein einzelner Dienst ausgeführt wird, da das ausgegebene Protokoll für Docker zugänglich ist.
Oder verwenden Sie dazu den Befehl Vordergrund
Dies funktioniert nur, wenn es ein Skript wie gibt
mysqld_safe
.Oder wickeln Sie Ihre Skripte ein
start.sh
und beenden Sie diesDies ist am besten, wenn der Befehl eine Reihe von Schritten ausführen muss und erneut ausgeführt werden
/start.sh
soll.Hinweis
Für Anfänger wird die Verwendung
supervisord
nicht empfohlen. Ehrlich gesagt ist es übertrieben. Es ist viel besser, einen einzelnen Dienst / einen einzelnen Befehl für den Container zu verwenden.Übrigens: Bitte überprüfen Sie https://registry.hub.docker.com auf vorhandene MySQL-Docker-Bilder als Referenz
quelle
docker exec -it <CONTAINER NAME> mysql /etc/init.d/mysqld restart
Fügen Sie in Ihrem
Dockerfile
in der letzten Zeile hinzuFür mich geht das
Und das ist das Ergebnis:
quelle
docker stop
oder ordnungsgemäß gestoppt werdendocker restart
kann, sondern nur getötet werden kann.Einfach! Fügen Sie am Ende der Docker-Datei hinzu:
quelle
Docker version 18.09.7, build 2d0083d
Ohne&& /bin/bash
den Dienst wird sofort gestopptEs gibt noch einen anderen Weg, den ich immer als besser lesbar empfunden habe.
Angenommen, Sie möchten rabbitmq und mongodb starten, wenn Sie es ausführen, dann
CMD
würde Ihr ungefähr so aussehen:Da Sie nur einen
CMD
proDockerfile
Trick haben können, besteht es darin, alle Anweisungen mit zu verketten&&
und dann\
für jeden Befehl eine neue Zeile zu beginnen.Wenn Sie am Ende viele davon hinzufügen, schlage ich vor, dass Sie alle Ihre Befehle in eine Skriptdatei einfügen und wie von @ larry-cai vorgeschlagen starten:
quelle
In meinem Fall wird eine PHP-Webanwendung von Apache2 im Docker-Container bereitgestellt, der eine Verbindung zu einer MYSQL-Backend-Datenbank herstellt. Die Lösung von Larry Cai funktionierte mit geringfügigen Änderungen. Ich habe eine
entrypoint.sh
Datei erstellt, in der ich meine Dienste verwalte. Ich denke, das Erstellenentrypoint.sh
eines Befehls, wenn Sie beim Starten Ihres Containers mehr als einen Befehl ausführen müssen, ist eine sauberere Methode zum Booten des Dockers.quelle
ENTRYPOINT ['your location']
Anweisung auf die Skriptdatei. Denken Sie jedoch daran, die Ausführungsberechtigungen für Ihr Skript festzulegen.COPY entrypoint.sh /entrypoint.sh RUN chmod 755 /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]
. In diesem Beispiel habe ich meinen Einstiegspunkt in das Stammverzeichnis im Docker-Container kopiert.Ich habe das gleiche Problem, wenn ich den SSH-Dienst automatisch starten möchte. Ich habe diesen Anhang gefunden
zu kann es lösen, aber nur Sie öffnen es mit Bash reicht aus.quelle
Ich füge den folgenden Code zu /root/.bashrc hinzu, um den Code nur einmal auszuführen.
Bitte übergeben Sie den Container an das Image, bevor Sie dieses Skript ausführen. Andernfalls wird die Datei 'docker_services' in den Images erstellt und kein Dienst ausgeführt.
quelle
So starte ich den MySQL-Dienst automatisch, wenn der Docker-Container ausgeführt wird.
In meinem Fall muss ich nicht nur MySQL, sondern auch PHP, Nginx und Memcached ausführen
Ich habe die folgenden Zeilen in Dockerfile
Durch Hinzufügen von && bash bleiben Nginx, MySQL, PHP und Memcached im Container ausgeführt.
quelle
Das funktioniert nicht
CMD service mysql start && /bin/bash
Das funktioniert nicht
CMD service mysql start ; /bin/bash ;
- Ich denke, der interaktive Modus würde den Vordergrund nicht unterstützen.
Das funktioniert !!
CMD service nginx start ; while true ; do sleep 100; done;
Das funktioniert !!
CMD service nginx start && tail -F /var/log/nginx/access.log
Vorsicht, Sie sollten
docker run -p 80:80 nginx_bash
ohne Befehlsparameter verwenden.quelle
Die folgende Dokumentation auf der Docker-Website zeigt, wie ein SSH-Dienst in einem Docker-Container implementiert wird. Es sollte leicht an Ihren Service anpassbar sein:
Eine Variation dieser Frage wurde auch hier gestellt:
quelle
Möglicherweise muss der vorhandene Container mit Docker Prune beschnitten werden ...
Import mit erforderlichen Änderungen:
Führen Sie den Container beispielsweise mit der Option "Immer neu starten" aus, um sicherzustellen, dass er nach dem Host / Daemon-Recycling automatisch fortgesetzt wird:
Randnotiz: Meiner Meinung nach ist es sinnvoll, nur den Cron-Service zu starten und den Container so sauber wie möglich zu lassen. Ändern Sie dann einfach crontab oder cron.hourly, .daily etc ... mit entsprechenden Überprüfungs- / Überwachungsskripten. Grund ist, dass Sie sich nur auf einen Daemon verlassen. Bei Änderungen ist es mit Ansible oder Puppet einfacher, Cron-Skripte neu zu verteilen, anstatt Dienste zu verfolgen, die beim Booten beginnen.
quelle