2016-07-14 55 views
0

的地方,我有這個Dockerfile工作正常,但有人告訴我,也許是不該做的最好辦法是什麼,我想:重要性CMD的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 

正如你所看到的,我正在爲lighttpd和php創建一個容器的圖像。

我的問題是關於我的Dockerfile中CMD部分的位置。我被告知最好把它放在文件的最後,但正如你所看到的,我在中間做了它,它工作得很好。

它不會停止創作,也沒有與在它下面的運行部分service lighttpd restart干擾。

有沒有關於這方面的最佳實踐或這是正常的?我可以在apt-get安裝後用我的CMD創建一個Dockerfile嗎?

感謝您對我的問題的回答,如果發生任何重大錯誤,請回覆我的英語。

+2

爲什麼要包含'RUN服務lighttpd restart'?在圖像中,沒有一個進程正在運行(這些進程只在容器中),因此只有一個層次只會啓動一個未使用restart命令運行的進程,然後立即退出,因爲「service」會很快退出,沒有多大意義。 – BMitch

+0

我現在知道了,但是自從我開始使用docker之後僅僅兩週時間,這個文件是我第一次嘗試正在工作的東西。我有一個新的版本後,與人打成一片,沒有更多的重新啓動,只有一個CMD在文件的末尾,但我們想知道爲什麼它適用於這些構想的「錯誤」^^ –

回答

1

我認爲這更符合邏輯偏好,當圖像尚未準備好時不需要定義命令。將CMD或ENTRYPOINT設置爲shell進行調試可能會使調試失敗的構建變得更容易一些,這更加方便。但除此之外,最後一個ENTRYPOINT和/或CMD會修改圖像的配置並繼承所有子圖像(Dockerfile的每一行)。

0

將Docker用作默認命令(加上Docker將使用最後一個,如果有多個的話),將CMD條目放在哪裏並不重要。如果您嘗試構建構建以優化緩存圖層,它可能會有所不同。也就是說,您希望將任何可能在Dockerfile中更低的內容。

我認爲這是更多的慣例,把它放在最後,使它更容易閱讀。在你的情況下是否有特定的原因你不要想把它放在最後?

+0

不,它只是一個在閱讀了很多Dockerfile之後,我對這部分內容進行了錯誤的解釋。我追加了一個在CMD文件中間的文件,並且在開始時我有一個錯誤,它告訴我該服務在嘗試使用時沒有運行lighty-enable-mod。當時我認爲在做我的命令之前先把CMD放到手邊就可以做到這一點,而巧合的是它確實...... –