Hallo FLUGreisende,
ich arbeite mich gerade in Docker ein, es gelingt mir einen Apache mit PHP aufzusetzen (auf Openmediavault 4 BTW)
Nun muß ich aber noch ein ganze Liste von PHP- und / oder Apache-Modulen laden, und frage mich bzw. Euch wie man das effizient in ein Dockerfile bekommt. Ich kann ja jetzt nicht mehr einfach im /etc rumpfuschen nehme ich an. Ich möchte auch alles was ich mache im Dockerfile späer wiederholbar machen.
Wei kann man die Instanz "updaten" nachdem man ein Dockerfile geändert hat? Oder muß man alles löschen und neu erzeugen?
Any tips welcome...
Hallo,
On Mon, May 06, 2019 at 02:56:57PM +0200, Andreas Delleske wrote:
Hallo FLUGreisende,
ich arbeite mich gerade in Docker ein, es gelingt mir einen Apache mit PHP aufzusetzen (auf Openmediavault 4 BTW)
Nun muß ich aber noch ein ganze Liste von PHP- und / oder Apache-Modulen laden, und frage mich bzw. Euch wie man das effizient in ein Dockerfile bekommt. Ich kann ja jetzt nicht mehr einfach im /etc rumpfuschen nehme ich an. Ich möchte auch alles was ich mache im Dockerfile späer wiederholbar machen.
Wenn du das offiziellen PHP Image vom Docker Hub als Basis verwendest, dann ist da ein Debian stretch drunter. Da kannst du einfach mit
RUN a2enmod modul1 modul2 ...
die Module aktivieren. PHP Module musst du installieren, das geht z.B. mit
RUN apt-get update && apt-get install -y paket1 paket2 ... && apt-get clean
Bei anderen Basisdistributionen sehen die Kommandos ggf. anders aus. Evtl. ist es auch erforderlich, direkt in eine Apache-Konfigurationsdatei zu schreiben.
Oft ist es hilfreich, interaktiv in einem Container zu arbeiten und die genutzten Befehle aufzuschreiben, so dass man sie später ins Dockerfile einbauen kann.
Wei kann man die Instanz "updaten" nachdem man ein Dockerfile geändert hat? Oder muß man alles löschen und neu erzeugen?
Docker ist eigentlich so gedacht, dass man das Image neu baut, wenn man im Dockerfile etwas geändert hat oder wenn das Basis-Image aktualisiert wurde. Danach stoppt man die darauf aufbauenden Container, löscht sie und startet sie neu.
Je nach verwendetem Basis-Image kann man notfalls auch in den Container gehen und die Änderungen von Hand nachziehen. Das kann aber schnell zu nicht-reproduzierbaren Konfigurationen führen und sollte daher nur eine Ausnahme bleiben.
Gruß, Harald
Hallo Harald,
vielen Dank für Deine schnelle und ausführich Antwort!
RUN a2enmod modul1 modul2 ...
Danke, ich vermute das hat geklappt. Ich denk ich brauch nur rewrite.
die Module aktivieren. PHP Module musst du installieren, das geht z.B. mit
RUN apt-get update && apt-get install -y paket1 paket2 ... && apt-get clean
Ich hab das hier zurückbekommen:
Package php-gd is a virtual package provided by: php7.3-gd 7.3.4-2 [Not candidate version] php7.0-gd 7.0.33-0+deb9u3 [Not candidate version]
Package php-intl is a virtual package provided by: php7.3-intl 7.3.4-2 [Not candidate version] php7.0-intl 7.0.33-0+deb9u3 [Not candidate version]
Package php-pdo is a virtual package provided by: php7.3-common 7.3.4-2 [Not candidate version] php7.0-common 7.0.33-0+deb9u3 [Not candidate version]
E: Package 'php-gd' has no installation candidate E: Package 'php-intl' has no installation candidate E: Package 'php-pdo' has no installation candidate
---
Dann versuche ich es mit php7.3-gd usw, bekomme dann aber:
Package php7.3-gd is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source
E: Package 'php7.3-gd' has no installation candidate The command '/bin/sh -c apt-get update && apt-get install -y php7.3-gd && apt-get clean' returned a non-zero code: 100
----
Ist 7.3 zu modern? Kann ich das auch auf 7.2 nageln?
Bei anderen Basisdistributionen sehen die Kommandos ggf. anders aus. Evtl. ist es auch erforderlich, direkt in eine Apache-Konfigurationsdatei zu schreiben.
OK - dann mit sed /irgendwas/sowas/ oder?
Oft ist es hilfreich, interaktiv in einem Container zu arbeiten und die genutzten Befehle aufzuschreiben, so dass man sie später ins Dockerfile einbauen kann.
Also vermutlich mit docker exec... ?
Docker ist eigentlich so gedacht, dass man das Image neu baut, wenn man im Dockerfile etwas geändert hat oder wenn das Basis-Image aktualisiert wurde. Danach stoppt man die darauf aufbauenden Container, löscht sie und startet sie neu.
Ok danke, so hab ichs gemacht, ich dachte nur es gibt noch ein silver bullet :) "docker update --makeverythingright" oder so.