中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

dockerfile中ENTRYPOINT與CMD的區別

發布時間:2021-08-23 20:16:06 來源:億速云 閱讀:195 作者:chen 欄目:開發技術

這篇文章主要講解了“dockerfile中ENTRYPOINT與CMD的區別”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“dockerfile中ENTRYPOINT與CMD的區別”吧!

一、寫在前面

我們在上篇小作文docker容器dockerfile詳解對中dockerfile有了比較全面的認識,我們也提到ENTRYPOINTCMD都可以指定容器啟動命令。因為這兩個命令是掌握dockerfile編寫的核心,所以這邊還是單獨拿出來再講一講。

二、CMD 與 ENTRYPOINT主要區別

我們直接進入主題,CMD 與 ENTRYPOINT都是用于指定啟動容器執行的命令,區別在于:

  • 當docker run 命令中有參數時,守護進程會忽略CMD命令。

  • 使用ENTRYPOINT指令不會忽略,并且會接收docker run 參數附加到命令行中。

為了使構建的容器可以正常啟動,我們編寫的dockerfile文件必須包含一個CMD或ENTRYPOINT指令。

三、CMD 與 ENTRYPOINT的結合使用

1.CMD

CMD指令有三種形式:

  1. CMD ["executable","param1","param2"]exec形式,這是首選形式)

  2. CMD ["param1","param2"](作為ENTRYPOINT 的默認參數

  3. CMD command param1 param2(shell形式)

dockerfile文件中包含多個CMD時,只有最后一個被加載使用。

我們在dockerhub中搜索centos官方鏡像,看一下的官方dockerfile文件。

dockerfile中ENTRYPOINT與CMD的區別

基本上每一個官方鏡像都會為我們提供各自版本的dockerfile鏈接,如下:

dockerfile中ENTRYPOINT與CMD的區別

我們查看latest標簽的dockerfile

FROM scratch
ADD centos-8-x86_64.tar.xz /
LABEL org.label-schema.schema-version="1.0"     org.label-schema.name="CentOS Base Image"     org.label-schema.vendor="CentOS"     org.label-schema.license="GPLv2"     org.label-schema.build-date="20201204"
CMD ["/bin/bash"]

只有四行,這就是構建一個latest版本centos8.3.2011鏡像的dockerfile全部內容。指定基鏡像(這里從scratch這個空鏡像開始構建),添加rootfs內容,打標簽,通過CMD指定啟動命令。

不止centos,其他debian、ubuntu、busybox等鏡像都只需通過CMD指定啟動命令。比如busybox更為簡約:

FROM scratch
ADD busybox.tar.xz /
CMD ["sh"]

這種基礎類、工具類鏡像的構建我們只需要指定一個必要CMD來啟動容器即可。但是我們編寫一個dockerfile并不是為了啟動容器而編寫,大多數時候我們要在容器運行我們的app,運行我們的服務。

當然通過CMD也可以啟動,可是如此一來有一個缺陷,我們上面說到的CMD的啟動命令會被docker run 參數代替。

我們有下面Dockerfile

[root@localhost dockerfiles]# cat Dockerfile 
FROM centos
CMD ["/bin/top","-b"]

構建后,使用參數ps啟動容器。

[root@localhost dockerfiles]# docker run  -it  centos_top:v1  ps
  PID TTY          TIME CMD
    1 pts/0    00:00:00 ps

可看看到啟動容器后top -b 已經被替換為ps,并非實現參數的替換。顯然這不是我們想要的。有沒有什么辦法既可以默認啟動應用,又可以加載到docker run 參數?這就是接下來ENTRYPOINT與CMD的妙用。

2.ENTRYPOINT結合CMD

ENTRYPOINT的exec和shell形式:

  • ENTRYPOINT ["executable", "param1", "param2"]

  • ENTRYPOINT command param1 param2

上面我們提到CMD ["param1","param2"]形式可以作為ENTRYPOINT參數,同時ENTRYPOINT 指定的命令無法被docker run 參數取代。假如我們把CMD和ENTRYPOINT兩個指令相結合,這樣我們就可以通過CMD來接收docker run 參數,然后把參數傳遞給ENTRYPOINT執行。

我們以nginx官方dockerfile latest版本1.21為例

dockerfile中ENTRYPOINT與CMD的區別

首先我們查看Dockerfile,這里我們只關注啟動命令,如下:

...
COPY docker-entrypoint.sh /
COPY 10-listen-on-ipv6-by-default.sh /docker-entrypoint.d
COPY 20-envsubst-on-templates.sh /docker-entrypoint.d
COPY 30-tune-worker-processes.sh /docker-entrypoint.d
ENTRYPOINT ["/docker-entrypoint.sh"]

EXPOSE 80

STOPSIGNAL SIGQUIT

CMD ["nginx", "-g", "daemon off;"]

從上面我們可以看到,在啟動nginx容器時首先運行docker-entrypoint.sh腳本并把CMD命令中的參數nginx -g "daemon off;"傳遞進來。即docker run不添加參數時啟動容器相當于執行如下腳本與默認參數。

#docker-entrypoint.sh nginx -g "daemon off;"

當我們使用docker run 傳入參數會怎樣?

我傳入nginx-debug

#docker run -dt nginx nginx-debug -g "daemon off;"

此時啟動容器相當于執行如下腳本與參數

#docker-entrypoint.sh nginx-debug -g "daemon off;"

我們通過ps來看一下我們啟動的容器

[root@localhost dockerfiles]# ps -ef|grep nginx
root      6327  6306  0 Aug12 pts/0    00:00:00 nginx: master process nginx -g daemon off;
101       6384  6327  0 Aug12 pts/0    00:00:00 nginx: worker process
101       6385  6327  0 Aug12 pts/0    00:00:00 nginx: worker process
root     16800 16780  3 12:51 pts/0    00:00:00 nginx: master process nginx-debug -g daemon off;
101      16857 16800  0 12:51 pts/0    00:00:00 nginx: worker process
101      16858 16800  0 12:51 pts/0    00:00:00 nginx: worker process

顯然我們兩種參數nginx、nginx-debug的容器都啟動成功!

也就是說我們通過ENTRYPOINT ["/docker-entrypoint.sh"]指定的命令在啟動時無論如何都會執行,并且可以接收到了docker run 的參數。

docker-entrypoint.sh是什么?docker-entrypoint.sh這是一個預處理腳本通常用來過濾命令行參數或者執行exec 來啟動容器為1的進程。

通過ENTRYPOINT+CMD實現命令默認參數或接收docker run 參數是一種非常流行并且有用的dockerfile編寫方式。

感謝各位的閱讀,以上就是“dockerfile中ENTRYPOINT與CMD的區別”的內容了,經過本文的學習后,相信大家對dockerfile中ENTRYPOINT與CMD的區別這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

聂拉木县| 武川县| 台南县| 民丰县| 玛曲县| 卓尼县| 全南县| 虎林市| 库尔勒市| 和平区| 九龙县| 长寿区| 石嘴山市| 新昌县| 广元市| 临汾市| 安福县| 工布江达县| 五台县| 北流市| 马尔康县| 永德县| 邮箱| 榆社县| 漾濞| 盘山县| 安平县| 塘沽区| 达日县| 南江县| 东乡县| 洛南县| 汉寿县| 彰武县| 德钦县| 台州市| 道孚县| 农安县| 九龙坡区| 前郭尔| 松溪县|