Docker學習及DevOps實踐:5.Dockerfile語法中的RUN、CMD、ENTRYPOINT

一、三個命令的總覽

  • RUN: 在基於FROM指定的Base Image創建臨時Container(容器)後,執行RUN指定的命令,並創建一層新的Image Layer(鏡像層)。
  • CMD: 設置容器啓動後默認執行的命令和參數。
  • ENTRYPOINT: 設置容器啓動時運行的命令。

二、Shell格式和Exec格式

1.Shell格式

直接將shell命令放在關鍵字之後,例如:

RUN apt-get install -y vim
CMD echo "hello docker"
ENTRYPOINT echo "hello docker"
2.Exec格式

使用固定格式指明要運行的命令,及命令的參數。

RUN["apt-get","install","-y","vim"]
CMD["/bin/echo","hello docker"]
ENTRYPOINT["/bin/echo","hello docker"]
3.Exec格式能不能取到EVN關鍵字定義的變量?
  • Shell格式的dockerfile
FROM ubuntu
EVN name Docker
ENTRYPOINT echo "hello $name"

構建出鏡像後,docker run創建容器啓動後,會打印出“hello Docker”

  • Exec格式的dockerfile
FROM ubuntu
EVN name Docker
ENTRYPOINT ["/bin/echo","hello $name"]

構建出鏡像後,docker run創建容器啓動後,會打印出“hello $name”

-爲什麼Exec格式取不到EVN定義的變量呢?因爲Shell格式是使用bash shell執行RUN後面的命令,而bash shell中能識別$標識的變量;而Exec是直接執行[""]中的首位內容,即直接執行/bin/echo,識別不到變量。

  • 修改一下:
FROM ubuntu
EVN name Docker
ENTRYPOINT ["/bin/bash","-c","echo hello $name"]

三、關鍵字:CMD

  • 容器啓動(docker run)時默認執行的命令。
  • 如果容器啓動時指定了其他命令,如docker run -it image,則CMD命令將被忽略。
  • 如果定義了多個CMD,只有最後一個會執行。
FROM ubuntu
EVN name Docker
ENTRYPOINT echo "hello $name"

當使用docker run image時會輸出:hello Docker
當使用docker run -it image時會輸出:無輸出,CMD關鍵字被忽略。


四、關鍵字:ENTRYPOINT

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