Docker: apache, mysql automatisch starten

Um Services und Init-Skripte (bspw. Apache, MySQL) in Docker-Container zum Laufen zu kriegen, muss man etwas umdenken. Grund hierfür ist, dass ein Init-Skript nicht über RUN gestartet werden kann:

FROM ubuntu:latest 

RUN apt-get update
RUN apt-get -y install apache2 RUN apt-get -y install mysql

# Funktioniert nicht
RUN update-rc.d apache2 defaults

# Funktioniert auch nicht
RUN service apache2 start EXPOSE 80 EXPOSE 3306

RUN wird einmalig beim Erstellen des Images (bspw. "docker build -t myXamppImage .") ausgeführt. Startet man nun einen Container auf Basis des frisch erstellten Images (bspw. "docker run -d -it --name myXamppContainer -p 3306:3306 -p 80:80 myXamppImage"), werden die RUN-Befehle aus dem Dockerfile nicht mehr ausgeführt.

Die Lösung lautet CMD oder ENTRYPOINT. Um Apache automatisch zu starten, hilft folgender Eintrag im Dockerfile: ENTRYPOINT service apache2 start && /bin/bash. Hiermit wird Apache gestartet und gleichzeitig /bin/bash als "Einstiegspunkt" verwendet. Dies ist zwingend erforderlich, da einerseits Docker einen "nicht endenden" Prozess erwartet (ansonsten wird der Container einfach wieder gestoppt) und anderseits wir nun mal die Bash als Einstiegspunkt erwarten.

So könnte das Dockerfile basierend auf Ubuntu aussehen, um Apache2/MySQL zu installieren und automatisch zu starten:

FROM ubuntu:latest 

RUN apt-get update
RUN apt-get -y install apache2
RUN apt-get -y install mysql

ENTRYPOINT service apache2 start && service mysql start && /bin/bash

EXPOSE 80
EXPOSE 3306

Weitere Quellen