久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Linux中CMD指令怎么用

168次閱讀
沒有評論

共計 2360 個字符,預計需要花費 6 分鐘才能閱讀完成。

這篇文章主要為大家展示了“Linux 中 CMD 指令怎么用”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓丸趣 TV 小編帶領大家一起研究并學習一下“Linux 中 CMD 指令怎么用”這篇文章吧。

Dockerfile 中只能有一條 CMD 指令。如果列出多個,CMD 則只有最后一個 CMD 會生效。CMD 主要目的是為運行容器時提供默認值。

Docker 不是虛擬機,容器就是進程,CMD 指令就是用于指定默認的容器主進程的啟動命令的。在啟動 (運行) 一個容器時可以指定新的命令來替代鏡像設置中的這個默認命令。

可以包含可執行文件,當然也可以省略。CMD 指令的格式和 RUN 相似,也是兩種格式:

shell 格式:CMD 命令 exec 格式:CMD [可執行文件 , 參數 1 , 參數 2 …]參數列表格式:CMD [參數 1 , 參數 2 …]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具體的參數。

注意:不要混淆 RUN 和 CMD。RUN 實際上運行一個命令并提交結果; CMD 在構建時不執行任何操作,但指定鏡像的默認命令。

Linux 中 CMD 指令怎么用

插個小消息,也方便想學習的同學,在文章下方留言即可試聽課程外加領取千鋒 HTML5、UI 交互設計、PHP、Java+ 云數據、大數據開發、VR/AR/Unity 游戲開發、Python 人工智能、Linux 云計算、全棧軟件測試、網絡安全等全部的視頻學習教程。

Docker 不是虛擬機,容器內沒有后臺服務的概念。不要期望這樣啟動一個程序到后臺:

CMD systemctl start nginx

這行被 Docker 理解為:

CMD [sh -c systemctl start nginx]

對于容器而言,其啟動程序就是容器的應用進程,容器就是為了主進程而存在的,主進程退出,容器就失去了存在的意義,從而退出,其它輔助進程不是它需要關心的東西。

就像上面的示例中,主進程是 sh , 那么當 service nginx start 命令結束后,sh 也就結束了,sh 作為主進程退出了,自然就會使容器退出。

Linux 中 CMD 指令怎么用

正確的做法是直接執行 nginx 這個可執行文件,并且關閉后臺守護的方式,使程序在前臺運行。

CMD [nginx , -g , daemon off;]

ENTRYPOINT 指令

ENTRYPOINT 的目的和 CMD 一樣,都是在指定容器的啟動程序及參數。

ENTRYPOINT 在運行時也可以被替代,不過比 CMD 要略顯繁瑣,需要通過 docker run 的參數 –entrypoint 來指定。

ENTRYPOINT 的格式和 RUN 指令格式一樣,也分為 exec 格式和 shell 格式。

當指定了 ENTRYPOINT 后,CMD 的含義就發生了改變,不再是直接的運行其命令,而是將 CMD 的內容作為參數傳給 ENTRYPOINT 指令,也就是實際執行時,將變為:

ENTRYPOINT CMD

有了 CMD 后,為什么還要有 ENTRYPOINT 呢?

這種 ENTRYPOINT CMD 給我們帶來了什么好處么?

讓我們來看幾個場景。

場景一:讓鏡像變成像命令一樣使用

CMD 方式

FROM centos

RUN yum update \

yum install -y curl

CMD [curl , -s , http://ip.cn]

構建鏡像后, 運行容器

# docker run –rm centos-echo-ip-cmd

執行下面命令會報錯

# docker run –rm centos-echo-ip-cmd -i

我們可以看到報錯,executable file not found。之前我們說過,跟在鏡像名后面的是 command,運行時會替換 CMD 的默認值。因此這里的 -i 并不是添加在原來的 curl -s http://ip.cn 后面。而是替換了原來的 CMD,變成了 CMD [-i],而 -i 根本不是命令,所以報了可執行文件找不到。

所以應該使用 ENTRYPOINT 方式

FROM centos

RUN yum install -y curl

ENTRYPOINT [curl , -s , http://ip.cn]

再次構建鏡像后, 運行容器

# docker run –rm centos-echo-ip-entrypoint

# docker run –rm centos-echo-ip-entrypoint -i

這樣的話, 最終的指令就變成 ENTRYPOINT [curl , -s , http://ip.cn , -i]

場景二:應用運行前的準備工作

啟動容器就是啟動主進程,但有些時候,啟動主進程前,需要一些準備工作。

官方鏡像 redis 中的示例:

FROM alpine:3.4

RUN addgroup -S redis adduser -S -G redis redis

ENTRYPOINT [docker-entrypoint.sh]

EXPOSE 6379

CMD [redis-server]

可以看到其中為 redis 服務創建了 redis 用戶,并在最后指定了 ENTRYPOINT 為 docker-entrypoint.sh 腳本。

#!/bin/sh

# allow the container to be started with `–user`

if [$1 = redis-server -a $(id -u) = 0 then

chown -R redis .

exec gosu redis $0 $@

fi

exec $@

該腳本的內容就是根據 CMD 的內容來判斷,如果是 redis-server 的話,則切換到 redis 用戶身份啟動服務器,否則依舊使用 root 身份執行。比如:

$ docker run -it redis id

uid=0(root) gid=0(root) groups=0(root)

還有 ENTRYPOINT 指令不會被 RUN 指令覆蓋,而 CMD 指令會被 RUN 指令覆蓋。

以上是“Linux 中 CMD 指令怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-25發表,共計2360字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 土默特左旗| 留坝县| 星子县| 泊头市| 开鲁县| 甘孜| 建始县| 武定县| 丹江口市| 九龙县| 卢龙县| 义马市| 台东县| 哈密市| 玛曲县| 湟中县| 弥渡县| 鄯善县| 泗水县| 申扎县| 淳化县| 茌平县| 潼关县| 柳林县| 大田县| 阿巴嘎旗| 灵台县| 开平市| 望奎县| 高邮市| 墨江| 元谋县| 五原县| 泽普县| 亚东县| 定兴县| 武强县| 澄城县| 库伦旗| 安吉县| 灵石县|