Docker学习(二十二)Dockerfile 中 CMD 与 ENTRYPOINT 区别
创始人
2025-05-30 06:17:56
0

目录

    • 一、CMD 指令
      • 1.1 常见用法:
      • 1.2 用法1举例:
      • 1.3 docker run 覆盖
    • 二、ENTRYPOINT 指令
      • 2.1 常见用法:
      • 2.2 两种写法:
    • 三、ENTRYPOINT 指令和 CMD 指令正确用法举例

Dockerfile 中的 CMDENTRYPOINT 指令是用于定义容器的默认执行命令的两个指令。尽管它们的作用相同,但它们在使用方式上还是有一些区别。

先说结论:

我们指定容器的启动脚本一般就是使用 ENTRYPOINT 来指定。我们可以把那些可能需要变动的参数写到 CMD 中,而把那些不需要变动的参数写到 ENTRYPOINT 里面。

下面详细介绍一下 CMD 指令 和 ENTRYPOINT 指令:

一、CMD 指令

CMD 指令:在容器运行时提供一些命令及参数。存在多条 CMD 指令时,仅最后一个生效。

1.1 常见用法:

  • 用法1: 运行一个可执行的文件并提供参数:(exec form, this is the preferred form)

    通常是shell命令且以 "/bin/sh -c" 来运行它,此时运行为shell的子进程,能使用shell操作符。

    CMD ["executable","param1","param2"]
    
  • 用法2:ENTRYPOINT 指定参数:(as default parameters to ENTRYPOINT)

    不会以 "/bin/sh -c" 运行(非shell子进程),因此不支持shell操作符如变量替换和通配符(?,*等)。

    CMD ["param1","param2"]
    
  • 用法3:/bin/sh -c 的方法执行的命令:(shell form)

    需要结合ENTRYPOINT指令提供默认参数使用。

    CMD command param1 param2
    

1.2 用法1举例:

我们指定如下命令:

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

构建镜像:

doker build -t echo-test .

创建并运行容器:

docker run --name=echo-test echo-test

输出内容:

this is a test.

1.3 docker run 覆盖

当使用 docker run 命令创建容器时,如果指定了参数,就会把 CMD 中指定的命令覆盖掉。例如:

当我们使用如下命令创建并运行容器时:

docker run --name=echo-test echo-test /bin/bash

输出内容:无,因为 CMD 指定的命令被 /bin/bash 覆盖了。

二、ENTRYPOINT 指令

ENTRYPOINT 指令:字面意思是进入点,用于在容器启动时指定默认的执行命令。存在多条 ENTRYPOINT 指令时,仅最后一个生效。

An ENTRYPOINT allows you to configure a container that will run as an executable.

它可以让你的容器功能表现得像一个可执行程序一样。

2.1 常见用法:

ENTRYPOINT 指令 只有一个用法:运行一个可执行的文件并提供参数

我们指定容器的启动脚本一般就是使用 ENTRYPOINT 来指定。我们可以把那些可能需要变动的参数写到 CMD 中,而把那些不需要变动的参数写到 ENTRYPOINT 里面。

2.2 两种写法:

  • 写法一:(the preferred exec form)

    ENTRYPOINT ["executable","param1","param2"]
    
  • 写法二:(shell form)

    ENTRYPOINT command param1 param2
    

注意:

  • 你也可以在 docker run 命令中使用 --entrypoint 指定启动命令,但是只能用写法一;

  • 第二种写法(shell form)会屏蔽掉 docker run 时后面指定的参数和 CMD 中指定的参数。

  • 网上有资料说 ENTRYPOINT 的默认值是 ["/bin/s","-c"],其实不然,当我们使用 ENTRYPOINT ["/bin/sh","-c"] 指令构造一个镜像 sh 时,我们可以这样运行:

    docker run -it sh "while(true) do echo loop; done;"
    

    会一直打印 loop:

    在这里插入图片描述

    但是如果我们直接运行一个 centos:latest 镜像:

    docker run -it centos:latest "while(true) do echo loop; done;"
    

    会报如下错误:

    在这里插入图片描述

    docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "while(true) do echo loop;done;": executable file not found in $PATH: unknown.
    

    所以可以得知默认情况下 ENTRYPOINT 并不是 ["/bin/sh","-c"],而应该是默认为空,使用时需要手动指定 "/bin/sh","-c"

    docker run -it centos:latest "/bin/sh" "-c" "while(true) do echo loop; done;"
    

    执行结果如下:

    在这里插入图片描述

三、ENTRYPOINT 指令和 CMD 指令正确用法举例

假如,我们需要写一个用于构建 nginx 基础镜像的 Dockerfile,我们可以这么写:

FROM centos:latest
RUN yum -q -y update && yum -q -y upgrade \&&  yum install -y nginx&&  yum clean all
EXPOSE 80
ENTRYPOINT ["nginx"]
CMD ["-c","/etc/nginx.conf"]
  • ENTRYPOINT 指令 指定了镜像的启动方式为 nginx 命令,一般不会被覆盖,需要的话可以通过在 docker run 中指定 --entrypoint 进行覆盖。

    docker run -it -p 81:80 --name=nginx-base --entrypoint /bin/bash nginx-base:v1
    
  • CMD 指令 指定了 nginx 启动时默认使用的配置文件位置,如果有需要,可以在 docker run 命令创建容器时重新指定配置文件的位置。

整理完毕,完结撒花~ 🌻





参考地址:

1.论docker中 CMD 与 ENTRYPOINT 的区别,https://www.scholat.com/vpost.html?pid=7633
2.Dockerfile文件解释,https://blog.csdn.net/weixin_42688573/article/details/125464719

相关内容

热门资讯

成都实现境外银行卡“直刷”坐地... 7月28日,成都地铁正式上线银行卡刷卡过闸功能,乘客持银联卡及境外发行的维萨卡(Visa)、万事达卡...
李嘉诚突发!长和一纸公告,坐实... 金融界7月28日消息 李嘉诚旗下的长和一纸公告出售港口一事迎来最近进展,坐实内地企业加入交易的传闻。...
坚持绿色发展,华帝荣获《证券之... 7月25日,2025证券之星ESG年度论坛暨第三届ESG新标杆企业奖颁奖盛典在上海盛大举行。作为厨电...
1219亿美元!全球AI领域吸... 人工智能领域正经历着前所未有的资本汇聚浪潮。2025年上半年,全球AI领域吸引风险投资1219亿美元...
美股散户狂欢背后,华尔街空头本... 美股散户持续上演狂欢的同时,华尔街空头正遭受惨痛打击。 S3 Partners数据显示,截至上周四,...
广期所出手,推进光伏组件期货研... 来源:集邦新能源网 集邦光储观察获悉,在近期中国光伏行业协会主办的光伏行业2025年上半年发展回顾与...
原创 左... 作者︱余在洋 与其抱怨环境糟糕,不如弯腰探求“活下来”的创新之道。就像上海这位面馆老板,他用“左手一...
股市必读:金博股份(68859... 截至2025年7月28日收盘,金博股份(688598)报收于27.23元,上涨0.67%,换手率2....
原创 高... 8天。2025年春节高速免费通行长达8天,7座及以下小客车全程免单。你是不是也想薅羊毛?想玩个骚操作...
标普500指数屡创新高,大型科... 21世纪经济报道记者舒晓婷 北京报道 受强劲业绩以及最新贸易动态提振,过去一周美国三大股指集体收涨。...
劲方医药再次冲刺港交所 核心产... 劲方医药科技(上海)股份有限公司(以下简称劲方医药)又一次向港交所发起冲刺,计划通过18A规则于主板...
工业硅、多晶硅:7月价格调整,... 【7月28日工业硅期货跌停,多晶硅价格下跌,市场情绪回落致价格大幅调整】7月28日,工业硅期货跌停,...
大赚超50亿!期货业上半年成绩... 【导读】全国期货公司上半年累计实现净利润50.74亿元 见习记者 舍梨 期货业上半年成绩单揭晓。 7...
赋能产业升级!逸马连锁产业集团... 深圳商报·读创客户端首席记者 刘琼 7月28日,由逸马连锁产业集团主办的“百亿连锁蛋糕·百路豪杰共享...
28日纸浆下跌1.72%,最新... 来源:新浪期货 新浪期货 根据交易所数据,截至7月28日收盘主力合约纸浆2509,涨跌-1.72%,...
美股民热衷“冷门潜力股” 近日,美股市场一甩二季度的阴霾。上周,标准普尔500指数上涨1.5%,至6389点,纳斯达克综合指数...
7月28日江特电机发布公告,股... 证券之星消息,7月28日江特电机发布公告《江特电机:详式权益变动报告书》,其股东王新于2025年2月...
无问芯穹CEO夏立雪:抵达AG... 新浪科技讯 7月28日下午消息,2025年世界人工智能大会期间,无问芯穹联合创始人、CEO夏立雪提出...
5名银行高管,密集履新佛山 南都N视频记者从国家金融监督管理总局广东监管局官网获悉,7月22日,佛山监管分局批复了5名银行高管在...