当前位置: 首页 > article >正文

Dockerfile中的RUN、CMD、ENTRYPOINT指令区别

  • RUN在构建过程中在镜像中执行命令。
  • CMD容器创建时的默认命令。(可以被覆盖)
  • ENTRYPOINT容器创建时的主要命令。(不可被覆盖)

指令介绍

1.RUN

在构建过程中在镜像中执行命令,是在 docker build中执行

2.CMD

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。 在docker run 时运行。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

CMD <shell 命令> 
CMD ["<可执行文件或命令>","<param1>","<param2>",...] 
CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

3.ENTRYPOINT

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。

优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。

注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

CMD和ENTRYPOINT区别以及搭配使用

ENTRYPOINT 指令和 CMD 指令的工作方式类似,但它们之间有一个关键区别:ENTRYPOINT 指定的程序不会被 docker run 命令行参数覆盖,而命令行参数会被当作参数传递给 ENTRYPOINT 指定的程序

理解示例

1. Dockerfile 示例

假设我们在 Dockerfile 中使用 ENTRYPOINT 指令:

FROM ubuntu
ENTRYPOINT ["echo", "Hello"]

在这个 Dockerfile 中,echoENTRYPOINT 指定的程序,而 "Hello" 是它的默认参数。

2. 运行容器时传递参数

当你使用 docker run 运行镜像时,如果你在命令行中传递了额外的参数,这些参数会被附加到 ENTRYPOINT 指定的程序之后,作为它的参数。

例如:

docker run my-ubuntu World

这个命令不会覆盖 ENTRYPOINT,而是将 World 作为参数传递给 echo,最终执行的命令是:

echo Hello World

输出结果:

Hello World

在这个例子中,docker run my-ubuntu World 将命令行参数 World 传递给了 echo 命令,使得最终的执行效果是输出 Hello World

3. 与 CMD 的区别

如果你在 Dockerfile 中使用的是 CMD 而不是 ENTRYPOINT,那么 docker run 中的参数会完全覆盖 CMD 指定的默认命令。

例如:

FROM ubuntu
CMD ["echo", "Hello"]

运行 docker run my-ubuntu World 时,World 会覆盖 CMD 中的 echo Hello,最终执行的命令是:

World

这会导致 docker: Error response from daemon: OCI runtime create failed 的错误,因为 World 不是有效的命令。

4. 结合 CMDENTRYPOINT

你还可以结合 ENTRYPOINTCMD 来提供更灵活的默认行为。例如:

FROM ubuntu
ENTRYPOINT ["echo"]
CMD ["Hello"]

在这种情况下,ENTRYPOINT 始终会执行 echo,而 CMD 中的 "Hello" 是默认参数。如果你运行:

docker run my-ubuntu

输出结果是:

Hello

但是,如果你运行:

docker run my-ubuntu World

这时,World 会覆盖 CMD"Hello",并作为参数传递给 echo,输出:

World

总结

  • ENTRYPOINT 不会被 docker run 命令行参数覆盖,命令行参数会传递给 ENTRYPOINT 指定的程序。
  • CMD 可以被 docker run 覆盖,且默认参数会在没有额外命令行参数时生效。

http://www.kler.cn/a/298558.html

相关文章:

  • 网络基础1 http1.0 1.1 http/2的演进史
  • C# XPTable 带图片的增删改查(XPTable控件使用说明十三)
  • MySQL insert or update方式性能比较
  • SpringBoot3动态切换数据源
  • C#异步多线程——ThreadPool线程池
  • 【网络安全 | 漏洞挖掘】通过监控调试模式实现价值$15k的RCE
  • 天气API使用记
  • 常用设计模式的通俗解释和c语言实现
  • 时空特征融合方向小论文创新点一次性都给你!看到就是赚到
  • Containerd从harbor拉镜像报错
  • java opencv no opencv_java490 in java.library.path
  • 数字经济时代,零售企业如何实现以消费者为中心的数字化转型?
  • 【前端】ui交互设计是什么?它和前端开发有什么关系
  • docker 简易入门
  • tabBar设置底部导航栏
  • 威胁建模STRIDE框架
  • 如何做好API安全
  • 如果美国衰退现货黄金市场怎样分析
  • 【数据结构】基本概念和术语
  • day-52 字母异位词分组
  • MQ-135空气质量传感器(STM32)
  • 数据结构(7.2_1)——顺序查找
  • 为明天做好准备,摆脱传统财务规划的不足
  • Oracle RAC环境NBU异机恢复
  • 使用 nuxi upgrade 升级现有nuxt项目版本
  • 蓝桥杯备赛day01:循环