Kubernetes:为容器设置启动时要执行的命令及其入参

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Kubernetes:为容器设置启动时要执行的命令及其入参

目录

DockerFile

CMD    

ENTRYPOINT

CMD 与 ENTRYPOINT 优先级

CMD 与 ENTRYPOINT 使用建议:

创建 Pod 时设置命令及入参

通过 shell 来执行命令

Docker 与 Kubernetes 的对应关系



DockerFile

CMD    

CMD指令在Dockerfile中仅允许一条,若出现多条,那么都会被最后一条CMD 指令覆盖掉

CMD指令主要是为容器运行时提供默认值,这些默认值可以有执行命令操作,也可以只有参数配置,这需要与ENTRYPOINT结合使用

CMD指令有着三种配置形式

CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;

CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;

CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;

CMD 示例:

CMD ["/usr/bin/wc","--help"]

CMD echo "This is a test." | wc -


ENTRYPOINT

ENTRYPOINT :配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。每个Dockerfile中只能有一个 ENTRYPOINT ,当指定多个时,只有最后一个起效

ENTRYPOINT指令配置形式

ENTRYPOINT ["executable", "param1", "param2"] (exec 形式, 推荐)

ENTRYPOINT command param1 param2 (shell 形式)

shell形式防止使用任何CMD或者运行命令行参数,但是缺点是ENTRYPOINT将作为/bin/sh -c的子命令启动,不传递信号。这意味着可执行文件将不是容器的PID 1,并且不接收Unix信号,因此您的可执行文件将不会从docker stop <container>接收到SIGTERM。


ENTRYPOINT 示例

ENTRYPOINT ["top", "-b"]

ENTRYPOINT exec top -b


CMD 与 ENTRYPOINT 优先级

  • Dockerfile应该指定至少一个CMD或ENTRYPOINT命令。
  • 在将容器用作可执行文件时,应该定义ENTRYPOINT。
  • CMD应该用作定义ENTRYPOINT命令的默认参数或在容器中执行特别命令的方法。
  • 当运行带有可选参数的容器时,CMD将被覆盖

 

No ENTRYPOINT

ENTRYPOINT exec_entry p1_entry  (shell 形式)

ENTRYPOINT [“exec_entry”, “p1_entry”]

(exec 形式)

NO CMD

 不允许

/bin/sh -c exec_entry p1_entry

exec_entry p1_entry

CMD [“exec_cmd”, “p1_cmd”] (exec 形式)

exec_cmd p1_cmd

/bin/sh -c exec_entry p1_entry

exec_entry p1_entry exec_cmd p1_cmd

CMD [“p1_cmd”, “p2_cmd”]  (参数 形式)

p1_cmd p2_cmd

/bin/sh -c exec_entry p1_entry

exec_entry p1_entry p1_cmd p2_cmd

CMD exec_cmd p1_cmd  (shell 形式)

/bin/sh -c exec_cmd p1_cmd

/bin/sh -c exec_entry p1_entr

exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd


CMD 与 ENTRYPOINT 使用建议:

(1)CMD命令用来执行image中的所有应用。CMD一般采用CMD [“executable”, “param1”, “param2”…]的格式来运行。所以,如果你的image是用来提供服务的,例如Apache,Rails。你就应该执行类似这样的命令CMD ["apache2","-DFOREGROUND"]。

(2)在其他的case中,CMD用来执行特定的shell,比如:bash,python,perl等等。比如: CMD ["perl", "-de0"] ,  CMD ["python"] , or  CMD [“php”, “-a”]。

(3)当你执行docker run -it python时就可以进入特定的shell中。

(4)CMD经常是配合 ENTRYPOINT 来使用的。除非确定你的用户非常了解ENTRYPOINT 的特性。否则还是建议你事先设定好ENTRYPOINT


创建 Pod 时设置命令及入参

创建 Pod 时,可以为其下的容器设置启动时要执行的命令及其入参。如果要设置命令,就填写在配置文件的 command 字段下,如果要设置命令的入参,就填写在配置文件的 args 字段下。一旦 Pod 创建完成,该命令及其入参就无法再进行更改了。

  • 如果在配置文件中设置了容器启动时要执行的命令及其入参,那么容器镜像中自带的命令与入参将会被覆盖而不再执行。
  • 如果配置文件中只是设置了入参却没有设置其对应的命令,那么容器镜像中自带的命令会使用该新入参作为其执行时的入参


通过 shell 来执行命令

有时候,您需要在 shell 脚本中运行命令。 例如,您要执行的命令可能由多个命令组合而成,或者它就是一个 shell 脚本。这时,就可以通过如下方式在 shell 中执行命令:

command: ["/bin/sh"]
args: ["-c", "while true; do echo hello; sleep 10;done"]


Docker 与 Kubernetes 的对应关系

描述 Docker 字段名称 Kubernetes 字段名称
容器执行的命令 Entrypoint command
传给命令的参数 Cmd args


如果要覆盖默认的 Entrypoint 与 Cmd,需要遵循如下规则:

  • 如果在容器配置中没有设置 command 或者 args,那么将使用 Docker 镜像自带的命令及其入参。
  • 如果在容器配置中只设置了 command 但是没有设置 args,那么容器启动时只会执行该命令,Docker 镜像中自带的命令及其入参会被忽略。
  • 如果在容器配置中只设置了 args,那么 Docker 镜像中自带的命令会使用该新入参作为其执行时的入参。
  • 如果在容器配置中同时设置了 commandargs,那么 Docker 镜像中自带的命令及其入参会被忽略。容器启动时只会执行配置中设置的命令,并使用配置中设置的入参作为命令的入参。


下表涵盖了各类设置场景:

镜像 Entrypoint 镜像 Cmd 容器 command 容器 args 命令执行
[/ep-1] [foo bar] <not set> <not set> [ep-1 foo bar]
[/ep-1] [foo bar] [/ep-2] <not set> [ep-2]
[/ep-1] [foo bar] <not set> [zoo boo] [ep-1 zoo boo]
[/ep-1] [foo bar] [/ep-2] [zoo boo] [ep-2 zoo boo]


参考链接:

https://kubernetes.io/zh/docs/tasks/inject-data-application/define-command-argument-container/#%E6%B3%A8%E6%84%8F


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
打赏
0
0
1
0
3331
分享
相关文章
DeepSeek大解读系列公开课上新!阿里云专家主讲云上智能算力、Kubernetes容器服务、DeepSeek私有化部署
智猩猩「DeepSeek大解读」系列公开课第三期即将开讲,聚焦阿里云弹性计算助力大模型训练与部署。三位专家将分别讲解智能算力支撑、Kubernetes容器服务在AI场景的应用实践、以及DeepSeek一键部署和多渠道应用集成,分享云计算如何赋能大模型发展。欲观看直播,可关注【智猩猩GenAI视频号】预约。 (239字符)
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
飞轮科技推出了 Doris 的 Kubernetes Operator 开源项目(简称:Doris Operator),并捐赠给 Apache 基金会。该工具集成了原生 Kubernetes 资源的复杂管理能力,并融合了 Doris 组件间的分布式协同、用户集群形态的按需定制等经验,为用户提供了一个更简洁、高效、易用的容器化部署方案。
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
317 78
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
182 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
193 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
容器服务Kubernetes场景下可观测体系生产级最佳实践
阿里云容器服务团队在2024年继续蝉联Gartner亚洲唯一全球领导者象限,其可观测体系是运维的核心能力之一。该体系涵盖重保运维、大规模集群稳定性、业务异常诊断等场景,特别是在AI和GPU场景下提供了全面的观测解决方案。通过Tracing、Metric和Log等技术,阿里云增强了对容器网络、存储及多集群架构的监控能力,帮助客户实现高效运维和成本优化。未来,结合AI助手,将进一步提升问题定位和解决效率,缩短MTTR,助力构建智能运维体系。
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
164 24
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
211 6
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
110 14
容器化、Kubernetes与微服务架构的融合
容器化、Kubernetes与微服务架构的融合
88 1

热门文章

最新文章

相关产品

  • 容器服务Kubernetes版
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等