[轉帖]Dockerfile中CMD與ENTRYPOINT命令的區別

济南小老虎發表於2024-03-12
https://cloud.tencent.com/developer/article/1906538

CMD與ENTRYPOINT區別

  • CMD命令設定容器啟動後預設執行的命令及其引數,但CMD設定的命令能夠被docker run命令後面的命令列引數替換
  • ENTRYPOINT配置容器啟動時的執行命令(不會被忽略,一定會被執行,即使執行 docker run時指定了其他命令)
  • ENTRYPOINT 的 Exec 格式用於設定容器啟動時要執行的命令及其引數,同時可透過CMD命令或者命令列引數提供額外的引數
  • ENTRYPOINT 中的引數始終會被使用,這是與CMD命令不同的一點

1. Shell格式和Exec格式命令

Shell格式指令 <command>

CMD java -jar test.jar

Exec格式指令 ["executable", "param1", "param2", ...]

ENTRYPOINT  ["java", "-jar", "test.jar"]

2. Shell格式和Exec格式命令的區別

  • Shell格式中的命令會直接被Shell解析
  • Exec格式不會直接解析,需要加引數

3. CMD和ENTRYPOINT指令支援的命令格式

CMD 指令的命令支援以下三種格式:

  • Exec格式: CMD ["executable","param1","param2"]
  • Exec引數: CMD ["param1","param2"] 用來為ENTRYPOINT 提供引數
  • Shell格式: CMD command param1 param2

ENTRYPOINT 指令的命令支援以下了兩種格式:

  • Exec格式:可用使用CMD的引數和可使用docker run [image] 引數 後面追加的引數
  • Shell格式 :不會使用 CMD引數,可使用docker run [image] 引數 後面追加的引數

4. 示例

ENTRYPOINT的Exec格式

# Dockerfile
FROM centos
ENTRYPOINT ["/bin/echo", "Hello"]

# 啟動容器的命令: docker run -it [image]
# 輸出: Hello
# 啟動容器的命令: docker run -it [image] Test
# 輸出: Hello Test

ENTRYPOINT的Exec格式 + CMD的Exec格式

# Dockerfile
FROM centos
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["Word"]

# 啟動容器的命令: docker run -it [image]
# 輸出: Hello Word
# 啟動容器的命令: docker run -it [image] Test
# 輸出: Hello Test

ENTRYPOINT的Exec格式 + CMD的shell格式

# Dockerfile
FROM centos
ENTRYPOINT ["/bin/echo", "Hello"]
CMD Word

# 啟動容器的命令: docker run -it [image]
# 輸出: Hello /bin/sh -c Word
# 啟動容器的命令: docker run -it [image] Test
# 輸出: Hello Test

ENTRYPOINT的shell格式

# Dockerfile
FROM centos
ENTRYPOINT /bin/echo "Hello"

# 啟動容器的命令: docker run -it [image]
# 輸出: Hello
# 啟動容器的命令: docker run -it [image] Test
# 輸出: Hello

ENTRYPOINT的shell格式 + CMD的Shell格式

# Dockerfile
FROM centos
ENTRYPOINT /bin/echo "Hello"
CMD Word

# 啟動容器的命令: docker run -it [image]
# 輸出: Hello
# 啟動容器的命令: docker run -it [image] Test
# 輸出: Hello

ENTRYPOINT的shell格式 +CMD的Exec格式

# Dockerfile
FROM centos
ENTRYPOINT /bin/echo "Hello"
CMD ["Word"]

# 啟動容器的命令: docker run -it [image]
# 輸出: Hello
# 啟動容器的命令: docker run -it [image] Test
# 輸出: Hello

參考連結

https://blog.csdn.net/weixin_42971363/article/details/91506844

原文出處:https://gitbook.curiouser.top/origin/docker-Dockerfile%E4%B8%ADCMD%E4%B8%8EENTRYPOINT%E5%91%BD%E4%BB%A4%E7%9A%84%E5%8C%BA%E5%88%AB.html

相關文章