CMD
支持三种格式
CMD [“executable”,”param1”,”param2”] 使用 exec 执行,推荐方式;
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
CMD [“param1”,”param2”] 提供给 ENTRYPOINT 的默认参数;
指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。
如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。
ENTRYPOINT
两种格式:
ENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT command param1 param2(shell中执行)。
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

从以上内容中可以看出,可以看到有两个共同点:

1.都可以指定shell或exec函数调用的方式执行命令;

2.当存在多个CMD指令或ENTRYPOINT指令时,只有最后一个生效;

但是在涉及到使用变量的时候只有shell的方式才可以,exec函数的形式不行

举例来说:

# Dockerfile文件内容
ENTRYPOINT [ "yarn", "run", "app-${ENV_CONFIG_INT}" ] # Compose yaml
test:
image: testimage/test:v1.0
build:
context: .
dockerfile: Dockerfile
env_file:
- ./docker.env
environment:
- ENV_CONFIG_INT=1

如上形式启动的时候会报错:

error Command "app-${ENV_CONFIG_INT}" not found.

这是因为ENTRYPOINT(以及CMD和RUN)的shell形式支持扩展环境变量,但是使用exec形式不扩展变量或处理任何其他shell构造。

也就是说使用要想处理变量的话,必须使用shell形式,也就是

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

ENTRYPOINT command param1 param2(shell中执行)。

比如启动jar包文件

# 使用如下这种形式设置变量就不行
ENTRYPOINT ["java","${PARAMS}","${JAVA_OPTS}","-Djava.security.egd=file:/dev/./urandom","-jar","demo-0.0.1-SNAPSHOT.jar"] # 可以使用这种形式
ENTRYPOINT ["sh", "-c", "java ${PARAMS} ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar demo-0.0.1-SNAPSHOT.jar"]
ENTRYPOINT java ${PARAMS} ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar demo-0.0.1-SNAPSHOT.jar

扩展

exce形式和shell形式的区别

shell表单阻止使用任何CMD或run命令行参数,但其缺点是ENTRYPOINT将作为/bin/sh-c的子命令启动,该子命令不传递信号。这意味着可执行文件不会是容器的PID 1,也不会接收Unix信号,因此您的可执行文件不会从docker stop接收SIGTERM。

CMD和Entrypoint命令使用变量的用法的更多相关文章

  1. Windows.命令行(CMD)_执行命令&环境变量

    1.CMD命令中如果 命令有换行的话,就使用 ^来连接(这就类似于 Linux命令行中 \ 的作用) 2.环境变量 2.1.显示 所有环境变量的值,命令:set 2.2.显示 某个环境变量的值,命令 ...

  2. Dockerfile 中的 CMD 与 ENTRYPOINT

    CMD 和 ENTRYPOINT 指令都是用来指定容器启动时运行的命令.单从功能上来看,这两个命令几乎是重复的.单独使用其中的一个就可以实现绝大多数的用例.但是既然 doker 同时提供了它们,为了在 ...

  3. Dockerfile 中的 CMD 与 ENTRYPOINT(转)

    add by zhj:  CMD和ENTRYPOINT的差异很小,可以认为完全可以相互代替.两者都支持shell模式和exec模式, shell模式:跟你在shell下执行命令的格式一样,简单方便,但 ...

  4. Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较

    1.概述 创建Docker镜像的方式有三种 docker commit命令:由容器生成镜像: Dockerfile文件+docker build命令: 从本地文件系统导入:OpenVZ的模板. 关于这 ...

  5. 论docker中 CMD 与 ENTRYPOINT 的区别

    Dockerfile里有 CMD 与 ENTRYPOINT 两个功能咋看起来很相似的指令,开始的时候觉得两个互用没什么所谓,但其实并非如此: CMD指令: The main purpose of a ...

  6. 论docker中 CMD 与 ENTRYPOINT 的区别(转)

    Dockerfile 用于自动化构建一个docker镜像.Dockerfile里有 CMD 与 ENTRYPOINT 两个功能咋看起来很相似的指令,开始的时候觉得两个互用没什么所谓,但其实并非如此: ...

  7. RUN vs CMD vs ENTRYPOINT - 每天5分钟玩转 Docker 容器技术(17)

    RUN.CMD 和 ENTRYPOINT 这三个 Dockerfile 指令看上去很类似,很容易混淆.本节将通过实践详细讨论它们的区别. 简单的说: RUN 执行命令并创建新的镜像层,RUN 经常用于 ...

  8. Dockerfile中CMD和ENTRYPOINT的区别

    当启动一个容器时,CMD和ENTRYPOINT都可以用来执行启动命令.但它们的具体用法还是有一些区别: 1. Dockerfile必须至少指定CMD或者ENTRYPOINT其中的一个. 2. ENTR ...

  9. 第 3 章 镜像 - 017 - RUN vs CMD vs ENTRYPOINT

    RUN.CMD 和 ENTRYPOINT 这三个 Dockerfile 指令看上去很类似,很容易混淆. 简单的说: RUN 执行命令并创建新的镜像层,RUN 经常用于安装软件包. CMD 设置容器启动 ...

随机推荐

  1. ArrayList集合存储基本数据类型

    如何存储基本数据类型 ArrayList对象不能存储基本类型,只能存储引用类型的数据.类似 <int> 不能写,但是存储基本数据类型对应的 包装类型是可以的.所以,想要存储基本类型数据, ...

  2. Root用户无法使用Tab补齐解决

    1. sudo vim /etc/bash.bashrc 2.取消以下注释 #if [ -f /etc/bash_completion ]; then # . /etc/bash_completion ...

  3. React报错之No duplicate props allowed

    正文从这开始~ 总览 当我们为相同的组件传递相同的属性多次时,就会导致"No duplicate props allowed"警告.为了解决该警告,请确保只传递一次该属性.比如说, ...

  4. r0capture安卓应用层通杀脚本-使用文档

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! r0capture安卓应用层通杀脚本-使 ...

  5. [开源项目]可观测、易使用的SpringBoot线程池

    在开发spring boot应用服务的时候,难免会使用到异步任务及线程池.spring boot的线程池是可以自定义的,所以我们经常会在项目里面看到类似于下面这样的代码 @Bean public Ex ...

  6. Git 06 分支

    参考源 https://www.bilibili.com/video/BV1FE411P7B3?spm_id_from=333.999.0.0 版本 本文章基于 Git 2.35.1.2 概述 分支用 ...

  7. HTTPS 一定是安全的吗?

    大家好,我是小林. 上周有位读者在面字节时被问道这么一个问题:HTTPS 一定安全可靠吗? 这个问题的场景是这样的:客户端通过浏览器向服务端发起 HTTPS 请求时,被「假基站」转发到了一个「中间人服 ...

  8. html + css 实现无需 js 的打字效果

    以前要达到类似在电脑上打字的效果,需要 js+html.今天我将介绍一种新方法.本文主要介绍纯 html+css 实现打字效果,有一定的参考价值,大家可以学习一下.提供所有代码,可以直接使用. 一.原 ...

  9. [CF1526D] Kill Anton(逆序对,搜索)

    题面 A N T O N \rm ANTON ANTON 的基因由 A , N , T , O \rm A,N,T,O A,N,T,O 四种碱基排列组成. A N T O N \rm ANTON AN ...

  10. 好好回答下 TCP 和 UDP 的区别

    写了这么多篇关于 TCP 和 UDP 的文章,还没有好好聊过这两个协议的区别,这篇文章我们就来开诚布公的谈一谈. 关于 TCP 和 UDP ,想必大家都看过一张这样的图. 有一个小姑娘在对着瓶口慢慢的 ...