日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Dockerfile命令RUN、CMD、ENTRYPOINT的区别

發布時間:2023/12/19 综合教程 29 生活家
生活随笔 收集整理的這篇文章主要介紹了 Dockerfile命令RUN、CMD、ENTRYPOINT的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

RUN

RUN命令是構建鏡像時執行的命令,屬于創建Docker鏡像(image)的步驟。一個Dockerfile中可以有許多個RUN命令。

例如:

RUN yum install -y telnet
RUN touch web.xml

CMD

CMD命令是構建容器后調用,也就是在容器啟動時才進行調用。一個Dockerfile僅僅最后一個CMD起作用。

格式:
    CMD ["executable","param1","param2"] (運行一個可執行的文件并提供參數)
    CMD ["param1","param2"] (設置了ENTRYPOINT,則直接調用ENTRYPOINT添加參數,即為ENTRYPOINT指定參數)
    CMD command param1 param2 (執行shell內部命令)
示例:
    CMD echo "This is a test." | wc -
    CMD ["/usr/bin/wc","--help"]注:   CMD不同于RUN,CMD用于指定在容器啟動時所要執行的命令,而RUN用于指定鏡像構建時所要執行的命令。

如你指定:

CMD ["/bin/echo", "this is a echo test"]

build后運行(假設鏡像名為ec):

docker run ec

就會輸出: this is a echo test

是不是感覺很像開機啟動項,你可以暫時這樣理解。

注意點:

但是如果在docker run后添加其他指令。那么CMD將直接被替換。

如:

docker run -it ubuntu /bin/bash

就不會輸出:this is a echo test,因為CMD命令被”/bin/bash”覆蓋了。

又比如下面這個Dockerfile文件:

FROM busybox
CMD echo "hello world"

CMD指明了Docker鏡像在運行時的輸出一個"hello world"

[root@bochs Docker]# docker build -t test .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM busybox
 ---> 83aa35aa1c79
Step 2/2 : CMD echo "hello world"
 ---> Running in a1a4d74137d2
Removing intermediate container a1a4d74137d2
 ---> 651b45b58fe9
Successfully built 651b45b58fe9
Successfully tagged test:latest
[root@bochs Docker]# docker run -it test hello world

但是如果在docker run后添加其他指令。那么CMD將直接被替換

[root@bochs Docker]# docker run -it test ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var

ENTRYPOINT

ENTRYPOINT與CMD類似,區別在于ENTRYPOINT一定會被執行。如果一個Dockerfile中同時存在ENTRYPOINT和CMD,CMD中的參數會被當做額外參數傳給ENTRYPOINT。

[root@bochs Docker]# cat Dockerfile 
FROM busybox
ENTRYPOINT ["/bin/echo","hello"]
CMD ["world"]

通過docker run 來運行,CMD變成了ENTRYPOINT的參數:

[root@bochs Docker]# docker run -it test2 
hello world

但是如果指明docker run 的參數china,那么輸出就會變為:

[root@bochs Docker]# docker run -it test2 china
hello china

原本CMD中帶的參數world被docker run中的china所替換,但ENTRYPOINT自帶的hello依然正常輸出

Shell與Exec格式

CMD,RUN,ENTRYPOINT可以用兩種格式來傳遞命令和參數,Shell一般表示為指令+命令,如:

RUN yum install -y telnet
CMD echo "hello world"

第一個大寫的單詞是Dockerfile的指令。后面跟的就是命令,可以拿到shell中單獨執行

Exec格式可以表示為:指令+["命令","命令參數1","命令參數2",...],比如:

RUN ["yum","install","telnet"]
ENTRYPOINT ["/bin/bash","-c","echo hello world"]

對于這兩種格式來說,CMD和ENTRYPOINT最好使用Exec格式,命令和參數分開,層次性較強,而RUN則都可以

注意:ENTRYPOINT的Shell格式和Exec格式差異很大

比如下面這個Shell格式的ENTRYPOINT

FROM busybox
ENTRYPOINT echo "hello"
CMD "world"

在運行所生成的容器時,僅會輸出hello,而CMD帶的"world"會被忽略。同樣的docker run帶的參數也同樣會被忽略

[root@bochs Docker]# docker run -it test
hello
[root@bochs Docker]# docker run -it test china
hello

參考文章:

Dockerfile文件詳解

Dockerfile 的 RUN 和 CMD、ENTRYPOINT

Dockerfile中RUN CMD以及ENTRYPOINT的區別

總結

以上是生活随笔為你收集整理的Dockerfile命令RUN、CMD、ENTRYPOINT的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。