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關鍵字被忽略。