Docker CMD ENTRYPOING 和Kubernetes command args对比

Docker CMD ENTRYPOING 和Kubernetes command args对比

exec 模式

使用 exec 模式时,容器中的任务进程就是容器内的 1 号进程

shell 模式

使用 shell 模式时,docker 会以 /bin/sh -c "task command" 的方式执行任务命令。也就是说容器中的 1 号进程不是任务进程而是 bash 进程

CMD 指令

CMD 指令的目的是:为容器提供默认的执行命令。

CMD 指令有三种使用方式,其中的一种是为 ENTRYPOINT 提供默认的参数:

?

CMD [param1","param2"]

另外两种使用方式分别是 exec 模式和 shell 模式:

?

CMD ["executable","param1","param2"] // 这是 exec 模式的写法,注意需要使用双引号。CMD command param1 param2 // 这是 shell 模式的写法。`

注意命令行参数可以覆盖 CMD 指令的设置,但是只能是重写,却不能给 CMD 中的命令通过命令行传递参数。
一般的镜像都会提供容器启动时的默认命令,但是有些场景中用户并不想执行默认的命令。用户可以通过命令行参数的方式覆盖 CMD 指令提供的默认命令。

ENTRYPOINT 指令

ENTRYPOINT 指令的目的也是为容器指定默认执行的任务。

ENTRYPOINT 指令有两种使用方式,就是我们前面介绍的 exec 模式和 shell 模式

ENTRYPOINT ["executable", "param1", "param2"] // 这是 exec 模式的写法,注意需要使用双引号。ENTRYPOINT command param1 param2 // 这是 shell 模式的写法。

exec 模式和 shell 模式的基本用法和 CMD 指令是一样的,下面我们介绍一些比较特殊的用法。

指定 ENTRYPOINT 指令为 exec 模式时,命令行上指定的参数会作为参数添加到 ENTRYPOINT 指定命令的参数列表中。
指定 ENTRYPOINT 指令为 shell 模式时,会完全忽略命令行参数

同时使用 CMD 和 ENTRYPOINT 的情况

对于 CMD 和 ENTRYPOINT 的设计而言,多数情况下它们应该是单独使用的。当然,有一个例外是 CMD 为 ENTRYPOINT 提供默认的可选参数。

我们大概可以总结出下面几条规律:

? 如果 ENTRYPOINT 使用了 shell 模式,CMD 指令会被忽略。

? 如果 ENTRYPOINT 使用了 exec 模式,CMD 指定的内容被追加为 ENTRYPOINT 指定命令的参数。

? 如果 ENTRYPOINT 使用了 exec 模式,CMD 也应该使用 exec 模式。

k8s command,args参数

注意

下表给出了Docker 与 Kubernetes中对应的字段名称。

Description Docker field name Kubernetes field name
The command run by the container Entrypoint command
The arguments passed to the command Cmd args

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

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

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

Image Entrypoint Image Cmd Container command Container args Command run
[/ep-1] [foo bar] [ep-1 foo bar]
[/ep-1] [foo bar] [/ep-2] [ep-2]
[/ep-1] [foo bar] [zoo boo] [ep-1 zoo boo]
[/ep-1] [foo bar] [/ep-2] [zoo boo] [ep-2 zoo boo]

官方文档 传送门

原文地址:https://www.cnblogs.com/h-gallop/p/11781119.html

时间: 2024-11-07 23:42:43

Docker CMD ENTRYPOING 和Kubernetes command args对比的相关文章

Docker CMD(命令)和 ARGS(参数)使用整理

Docker CMD(命令)和 ARGS(参数)使用整理 总览 K8S集群创建Pod时,可以为其下的容器设置启动时要执行的命令及其参数.设置命令,就填写在配置文件的command字段下,如果要设置命令的参数,就填写在配置文件的args字段下.一旦Pod创建完成,该命令及其入参无法再进行更改. 配置文件中设置了容器启动时要执行的命令及其参数,那么容器镜像中自带的命令 与参数将会被覆盖而不再执行.如果配置文件中只是设置了入参,却没有设置其对应的命令,那么容器镜像中自带的命令会使用该新参数作为其执行时

kubernetes 实战6_命令_Share Process Namespace between Containers in a Pod&Translate a Docker Compose File to Kubernetes Resources

Share Process Namespace between Containers in a Pod how to configure process namespace sharing for a pod. When process namespace sharing is enabled, processes in a container are visible to all other containers in that pod. You can use this feature to

Docker容器管理之Kubernetes

Kubernetes是Google开源的容器集群管理系统.它构建于docker技术之上,为容器化的应用提供资源调度.部署运行.服务发现.扩 容缩容等整一套功能,本质上可看作是基于容器技术的mini-PaaS平台.本文旨在梳理Kubernetes的架构.概念及基本工作流,并且通过运行一 个简单的示例应用来介绍如何使用Kubernetes. 总体概览 如下图所示是我初步阅读文档和源代码之后整理的总体概览,基本上可以从如下三个维度来认识Kubernetes. 操作对象 Kubernetes以RESTF

docker CMD ENTRYPOINT 区别

昨天用Dockerfile来启动mongodb的集群,启动参数--replSet死活没执行,最后就决定研究一哈cmd和entrypoint.但是上网看了一些资料个人觉得讲的不好,还是没有说出根本的东西,决定自己研究并且整理一哈. 首先上docker官网:https://docs.docker.com/engine/reference/builder/#cmd 感觉官网关于这两个命令讲的简直不要太清楚. cmd: 这个命令是用来做什么的?下面是官网的答案: The main purpose of

Docker集群管理系统Kubernetes

一.Kubernetes简介 Kubernetes 是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度.均衡容灾.服务注册.动态扩缩容等功能套件,利用Kubernetes能方便地管理跨机器运行容器化的应用.而且Kubernetes支持GCE.vShpere.CoreOS.OpenShift.Azure等平台上运行,也可以直接部署在物理主机上. 二.Kubernetes架构 1. Pod 在Kubernetes系统中,调度的最小颗粒不是单纯的容器,而是抽象成

Docker CMD in detail

CMD CMD 指令就是用于指定默认的容器主进程的启动命令的,我们直接 docker run -it ubuntu 的话,会直接进入 bash.我们也可以在运行时指定运行别的命令,如 docker run -it ubuntu cat /etc/os-release.这就是用 cat /etc/os-release 命令替换了默认的 /bin/bash 命令了,输出了系统版本信息. 在指令格式上,一般推荐使用 exec 格式,这类格式在解析时会被解析为 JSON 数组,因此一定要使用双引号 ",

项目环境搭建【Docker+k8s】十 || kubernetes资源配置运行容器

目录 部署Deployment 部署Service 经过上文的创建文件测试可以感受到,通过run命令启动容器非常麻烦.其中docker提供了compose解决了这个问题,而kubernetes使用kubectl create命令就可以做到和compose一样的效果,该命令可以通过配置文件快速创建一个集群资源对象. 部署Deployment 创建一个名为nginx-deployment.yml的配置文件,以创建nginx服务为例进行说明 注意:各版本配置文件内容有所不同,具体请参照官方文档. (例

项目环境搭建【Docker+k8s】九 || kubernetes创建容器

目录 创建容器 查看全部Pods状态 查看已部署的服务 发布服务 查看已发布的服务 查看服务详情 验证是否成功 停止服务 创建容器 命令中--replicas=2 启动2个实例,--port=80 运行在k8s的80端口上,没有进行映射端口 [[email protected] ~]# kubectl run nginx --image=nginx --replicas=2 --port=80 #输出如下: kubectl run --generator=deployment/apps.v1 i

Docker+Cmd+Cli+Git之前端工程化纪要(一)整体目标

之前一版的工程化核心产物就是一个IDE,即利用python+node将webpack等技术将FE的开发.编译.部署上线等环境集成在sublime中,产出了一个核心工具.但随着长期的使用与技术栈的优化升级等,原工程化工具的局限性.便利性.跨平台的兼容性等方面的问题正在逐渐暴露,加之最近的疫情因素,更让我们有理由对整个FE的工程化做一次彻底的升级. 根据之前的经验 和与同事的沟通后,对新的工程化工具提出了一下几点要求: (1) 跨平台(windows/mac/linux) (2) 满足远程办公需要