Dockerfile 中CMD 和 ENTRYPOINT指令

CMD 指令的三種格式:

CMD ["executable","param1","param2"] (exec form, this is the preferred form)

CMD ["param1","param2"] (as default parameters to ENTRYPOINT)

CMD command param1 param2 (shell form)


推薦格式,類似於執行exec           CMD ["exectuable","param1","param2"]

作爲entrypoint指令的參數          CMD ["param1","param2"]

類似於執行   /bin/bash -c         CMD command param1 param2

CMD指令用於Dockerfile 文件中時,只有最近的一條纔會生效(存在多條CMD無有意義)。


ENTRYPOINT 指令的兩種格式:

ENTRYPOINT ["executable", "param1", "param2"] (the preferred exec form)

ENTRYPOINT command param1 param2 (shell form)


推薦格式,類似於執行 exec             ENTRYPOINT ["executable", "param1", "param2"]

類似於執行 /bin/bash -c              ENTRYPOINT command param1 param2

ENTRYPOINT 指令用於Dockerfile文件中時,只有最近一條纔會生效(存在多條CMD指令無意義)


共同點:

1、CMD 和 ENTRYPOINT 指令用在Dockerfile文件中時,都是最近一條指令生效

2、有兩種指令形式是重合的。

3、都可以在創建container 時被覆蓋


異同點:

1、ENTRYPOINT通常用於在創建container時執行一個啓動的點,而這個功能是cmd所不能取代的

2、CMD 指令的其中一種形式是ENTRYPOINT 指令的參數,例如Dockerfile:

FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]


被覆蓋舉例:

CMD 被覆蓋的例子,假如生成一個p_w_picpath 的 dockerfile 文件爲如下格式:

FROM ubuntu
CMD ["/usr/bin/wc","--help"]

docker build -t ubuntu:cmd .

創建container 時:

docker run -it ubuntu:cmd pwd # 此時pwd 指令就覆蓋了 /usr/bin/wc --help 指令而顯示的爲一個路徑。


ENTRYPOINT被覆蓋的例子,假如生成一個p_w_picpath 的 dockerfile 文件的格式如下:

FROM debian:stable
RUN apt-get update && apt-get install -y --force-yes apache2
EXPOSE 80 443
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

docker build -t debian:apache .


創建container 時:

docker run -d --entrypoint="/usr/sbin/nginx" debian:apache "-g 'daemon off;'"

此時 /usr/sbin/apache2ctl -D FOREGROUND 將被 /usr/sbin/nginx -g "daemon off;" 覆蓋

且這裏,-g "daemon off" 爲 CMD指令作爲 ENTRYPOINT指令的參數。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章