2016-07-14 9 views
0

Ich habe diese Dockerfile, die gut funktioniert, aber ich wurde gesagt, dass es vielleicht nicht der beste Weg ist zu tun, was ich wollte:Bedeutung des Orts von CMD in Dockerfile

FROM debian:jessie 
RUN apt-get update && apt-get install -y lighttpd php5-cgi php5-common php5 php5-mysql php5-gd 
RUN echo server.modules += \(\"mod_rewrite\"\) >> /etc/lighttpd/lighttpd.conf 
CMD ["lighttpd", "-D", "-f", "/etc/lighttpd/lighttpd.conf"] 
RUN lighty-enable-mod fastcgi-php 
RUN service lighttpd restart 
RUN chown -R www-data:www-data /var/www/html 

Wie Sie sehen können, Ich erstelle ein Bild für einen Container mit Lighttpd und PHP.

Meine Frage ist über die Stelle des CMD-Teils in meiner Dockerfile. Mir wurde gesagt, dass es besser ist, es am Ende der Datei zu setzen, aber wie Sie sehen können, habe ich es in der Mitte von mir gemacht, und es hat gut funktioniert.

Es stoppt nicht die Erstellung noch stört es die service lighttpd restart im Laufteil darunter.

Gibt es Best Practices in diesem Bereich oder ist das normal? Kann ich direkt nach der Installation von apt-get eine Dockerdatei mit meinem CMD erstellen?

Danke für Ihre Antworten zu meiner Frage und Entschuldigung für mein Englisch, wenn es große Fehler gibt.

+2

Warum "RUN service lighttpd restart" hinzufügen? Im Image wird kein einzelner Prozess ausgeführt (nur in Containern), sodass es einen Layer gibt, der lediglich einen Prozess startet, der nicht mit dem Befehl restart ausgeführt wurde, und dann sofort nach "service" beendet wird wird schnell verlassen, macht wenig Sinn. – BMitch

+0

Ich weiß jetzt, aber es ist nur zwei Wochen her, seit ich Docker gestartet habe und diese Datei war mein erster Versuch, etwas zu tun, das funktionierte. Ich habe eine neue Version, nachdem ich mit jemandem gesprochen habe, wo es keinen Neustart mehr gibt und nur ein CMD am Ende der Datei, aber wir haben uns gefragt, warum es gut mit diesen "Fehlern" der Konzeption funktionierte ^^ –

Antwort

1

Ich glaube, es ist eher eine logische Präferenz, keine Notwendigkeit, den Befehl zu definieren, wenn das Bild noch nicht fertig ist. Es gibt einen zusätzlichen Vorteil, dass das Debuggen mit dem CMD- oder ENTRYPOINT-Set für eine Shell das Debuggen eines fehlgeschlagenen Builds ein wenig einfacher macht. Aber ansonsten ändert der letzte ENTRYPOINT und/oder CMD die Konfiguration des Bildes und wird auf alle Kindbilder (jede Zeile Ihrer Dockerfile) vererbt.

0

Es sollte egal sein, wo Sie den CMD Eintrag in Bezug auf Docker verwenden, die als Standardbefehl verwenden (plus Docker wird den letzten verwenden, wenn es mehr als einen gibt). Wo es einen Unterschied machen könnte, ist, wenn Sie versuchen, Ihren Build zu strukturieren, um das Zwischenspeichern der Layer zu optimieren. Das heißt, Sie möchten alles, was sich wahrscheinlich ändern wird, in der Dockerdatei nach unten setzen.

Ich denke, es ist mehr Konvention, um es zuletzt und macht es leichter zu lesen. Gibt es einen bestimmten Grund in Ihrem Fall Sie nicht wollen es zuletzt setzen?

+0

Nein, es war nur ein schlechte Interpretation meines Teils nach dem Lesen einer Menge von Dockerfile Ich anhängen, um eine mit dem CMD in der Mitte der Datei zu sehen, und ich hatte einen Fehler am Anfang, wo es mir sagte, dass der Dienst nicht ausgeführt wurde, wenn es versuchte zu verwenden der Lighty-Enable-Mod. Ich dachte zu der Zeit, dass die CMD, bevor ich meinen Befehl ausführte, den Trick machen würde, und zufällig hat es ... –