Dockerfile中EntryPoint和CMD的区别

本文探讨Dockerfile中的ENTRYPOINT和CMD的共同点与区别。共同点在于它们都定义了镜像启动后的命令,且多个指令会覆盖前一个。不同之处在于,CMD可以被外部命令覆盖,而ENTRYPOINT则会将外部命令作为参数,且ENTRYPOINT的执行顺序在前。应用上,ENTRYPOINT更优,因为它能接受参数并封装命令,确保镜像的可用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

共同点和区别

共同:执行命令

这两个关键字,都可以指定镜像启动以后做的一些命令,这点不需要证明了。

共同:唯一性

多个相同关键字会覆盖,只取最后一个执行

mkdir aaa && cd aaa

cat <<EOF > dockerfile01
FROM busybox
CMD echo 1
CMD echo 2
CMD echo 3
EOF

docker build -f dockerfile01 -t a:01 .
docker run --rm a:01 # 输出3

说明只取最后一个 CMD 执行

cat <<EOF > dockerfile02
FROM busybox
ENTRYPOINT ["echo","4"]
ENTRYPOINT ["echo","5"]
ENTRYPOINT ["echo","6"]
EOF

docker build -f dockerfile02 -t a:02 .
docker run --rm a:02  # 输出6

说明也只取最后一个 ENTRYPOINT 执行

操作截图
a01,a02

区别:外部Command处理

先测试CMD

cat <<EOF > dockerfile11
FROM busybox
CMD echo 11111111
EOF

docker build -f dockerfile11 -t a:11 .
docker run --rm a:11    # 输出 11111111
docker run --rm a:11 echo outside-command # 输出 outside-command

可见,外部CMD可以覆盖dockerfile中的CMD

再看看EntryPoint

cat <<EOF > dockerfile12
FROM busybox
ENTRYPOINT ["echo","11112222"]
EOF

docker build -f dockerfile12 -t a:12 .
docker run --rm a:12    # 输出 11112222
docker run --rm a:12 echo outside-command # 输出 outside-command

可见,外部command不能覆盖entrypoint,只能作为参数。
能够输入外部参数,也是Entrypoint比CMD好用的主要原因。

同时,entrypoint也可以被外部command覆盖,通过docker run --entrypoint 覆盖。
比如:docker run --rm --entrypoint ping a:12 127.0.0.1

操作截图
a11,a12

区别:执行顺序

Entrypoint先执行

# 生成dockerfile
cat <<EOF > dockerfile21
FROM busybox
CMD echo CMD-21
ENTRYPOINT ["echo","ENTRYPOINT-21"]
EOF
cat <<EOF > dockerfile22
FROM busybox
ENTRYPOINT ["echo","ENTRYPOINT-22"]
CMD echo CMD-22
EOF
# 编译镜像
docker build -f dockerfile21 -t a:21 .
docker build -f dockerfile22 -t a:22 .
# 执行,无外部参数
docker run --rm a:21  #输出:ENTRYPOINT-21 /bin/sh -c echo CMD-21
docker run --rm a:22  #输出:ENTRYPOINT-21 /bin/sh -c echo CMD-21
## 可见都是,先执行Entrypoint,CMD只能作为EntryPoint参数

# 执行,带外部参数
docker run --rm a:21 echo aaaaaa  #输出:ENTRYPOINT-21 echo aaaaaa
docker run --rm a:22 echo bbbbbb  #输出:ENTRYPOINT-22 echo bbbbbb
## 可见,先执行Entrypoint,CMD被外部参数覆盖,仍是作为EntryPoint的参数

操作截图

a1212-5

应用

首先,Entrypoint是首选,不管啥镜像,用他就对了。
CMD最大的问题是无法接受参数!!!

  • entrypoint可以封装命令。只需传参数,不关心核心命令是什么。比如 docker run write:1.0 "this is a book"
  • entrypoint可以封死了镜像。除非Dockerfile重写entrypoint,否则都是执行基础镜像的entrypoint,保证可用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值