BEARBEITEN:Ich habe viel über Docker gelernt, seit ich diese Antwort ursprünglich gepostet habe. „Dienste automatisch in Docker-Containern starten“ ist kein gutes Nutzungsmuster für Docker. Verwenden Sie stattdessen etwas wie Fleet, Kubernetes oder sogar Monit/SystemD/Upstart/Init.d/Cron, um automatisch Dienste zu starten, die in Docker-Containern ausgeführt werden.
URSPRÜNGLICHE ANTWORT:Wenn Sie den Container mit dem Befehl /bin/bash
starten , dann können Sie dies auf die hier beschriebene Weise erreichen:https://stackoverflow.com/a/19872810/2971199
Also, wenn Sie den Container mit docker run -i -t IMAGE /bin/bash
starten und wenn Sie apache2 automatisch starten möchten, wenn der Container gestartet wird, bearbeiten Sie /etc/bash.bashrc
in den Container und fügen Sie /usr/local/apache2/bin/apachectl -f /usr/local/apache2/conf/httpd.conf
hinzu (oder was auch immer Ihr Apache2-Startbefehl ist) zu einem Zeilenumbruch am Ende der Datei.
Speichern Sie die Änderungen an Ihrem Bild und starten Sie es mit docker run -i -t IMAGE /bin/bash
neu und Sie werden feststellen, dass Apache2 ausgeführt wird, wenn Sie es anhängen.
Ich schätze, das kannst du nicht. Was Sie tun können, ist, ein Image mit einem Dockerfile zu erstellen und darin eine CMD zu definieren, die ausgeführt wird, wenn der Container gestartet wird. Sehen Sie sich die Builder-Dokumentation für die Grundlagen an (https://docs.docker.com/reference/builder/) und finden Sie unter Automatisches Ausführen eines Dienstes in einem Docker-Container Informationen darüber, wie Sie Ihren Dienst am Laufen halten.
Sie müssen dies nicht mit einem Dockerfile automatisieren. Sie können das Image auch wie gewohnt über einen manuellen Commit erstellen und es über die Befehlszeile ausführen. Dann geben Sie den Befehl an, der ausgeführt werden soll (genau das, was die Dockerfile-CMD tatsächlich tut). Sie können die Dockerfiles-CMD auch auf diese Weise überschreiben:Es wird nur die neueste CMD ausgeführt, was der Befehlszeilenbefehl ist, wenn Sie den Container damit starten. Der grundlegende docker run -i -t base /bin/bash
Befehl aus der Dokumentation ist ein Beispiel. Wenn Ihr Befehl zu lang wird, können Sie natürlich ein praktisches Skript erstellen.
Eine Option, die Sie verwenden könnten, wäre die Verwendung eines Prozessmanagers wie Supervisord, um mehrere Prozesse auszuführen. Jemand hat dies mit sshd und mongodb erreicht:https://github.com/justone/docker-mongodb