Dockerfile的CMD总结

最近又在写Dockerfile,在写的过程中对CMD又测试了很多,对应的还有个ENTRYPOINT,也在网上找了很多资料,大概总结如下

先来大概说下Dockerfile中可以执行命令的指令,以下非原创,有出处

Dockerfile中RUN,CMD和ENTRYPOINT都能够用于执行命令,下面是三者的主要用途:

  • RUN命令执行命令并创建新的镜像层,通常用于安装软件包
  • CMD命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换
  • ENTRYPOINT配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行 docker run时指定了其他命令)

Shell格式和Exec格式运行命令

我们可用两种方式指定 RUN、CMD 和 ENTRYPOINT 要运行的命令:Shell 格式和 Exec 格式:

  • Shell格式:<instruction> <command>。例如:apt-get install python3
  • Exec格式:<instruction> ["executable", "param1", "param2", ...]。例如: ["apt-get", "install", "python3"]

CMD 和 ENTRYPOINT 推荐使用 Exec 格式,因为指令可读性更强,更容易理解。RUN 则两种格式都可以。

作者:伊凡的一天
链接:https://www.jianshu.com/p/f0a0f6a43907
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

docker CMD 有三种形式
CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;
指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。
如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。

shell 格式的话如下

CMD  echo "hello"

exec 格式的话如下

CMD ["echo","hello"]

exec 格式必须用双引号,中间用逗号隔开,执行命令 和命令后参数都是用双引号引起来,每个都要用逗号隔开。

shell 格式和 exec 格式主要区别在于

shell 格式的话,实际的命令会被包装为 sh -c 的参数的形式进行执行。比如:

CMD echo $HOME

在实际执行中,会将其变更为:

CMD [ "sh", "-c", "echo $HOME" ]

这就是为什么我们可以使用环境变量的原因,因为这些环境变量会被 shell 进行解析处理,CMD会使用容器内的shell变量,自定义ENV

如果使用exec 格式的话,CMD 不会使用容器内的变量和自定义ENV

比如我们自定义了ENV name=lisa

使用shell模式的话,可以输出$name 为lisa

但是exec 模式的话是不能正常输出$namd的

最后一种运行模式

CMD ["参数1","参数2"] 是配合 ENTRYPOINT 使用的

CMD 和 ENTRYPOINT 最大区别在于,CMD 指定在容器启动时候指定了指令就会覆盖CMD

但是 ENTRYPOINT 不会被覆盖,只能追加参数,CMD可以配合ENTRYPOINT 使用,可以给ENTRYPOINT追加参数,另外两者结合使用的时候 CMD 指令是可以被覆盖的。

原文地址:https://www.cnblogs.com/hh2737/p/11096872.html

时间: 2024-10-09 16:02:21

Dockerfile的CMD总结的相关文章

FW: Dockerfile RUN, CMD &amp; ENTRYPOINT

Dockerfile RUN, CMD & ENTRYPOINT 在使用Dockerfile创建image时, 有几条指令比较容易混淆, RUN, CMD, ENTRYPOINT. RUN是在building image时会运行的指令, 在Dockerfile中可以写多条RUN指令. CMD和ENTRYPOINT则是在运行container 时会运行的指令, 都只能写一条, 如果写了多条, 则最后一条生效. CMD和ENTRYPOINT的区别是: CMD在运行时会被command覆盖, ENTR

Dockerfile 中CMD 和 ENTRYPOINT指令

CMD 指令的三种格式: CMD ["executable","param1","param2"] (exec form, this is the preferred form) CMD ["param1","param2"] (as default parameters to ENTRYPOINT) CMD command param1 param2 (shell form) 推荐格式,类似于执行exec

Dockerfile中CMD命令和ENTRYPOINT 命令的说明

首先说明下RUN.CMD.ENTRYPOINT 等命令都可以用来执行命令,但是各有不同的特点 RUN 在Build Image的时候执行. CMD ENTRYPOINT 在运行Image时执行. CMD 可以和ENTRYPOINT 搭配使用,也可以单个命令使用.当CMD 和ENTRYPOINT都出现在一个DockerFile中时,CMD中设置的信息(EXEC格式的)都以参数的形式提供给ENTRYPOINT命令.EntryPoint 命令没有设置时,默认是/bin/bash ENTRYPOINT的

Docker Dockerfile 指令

Dockerfile 指令 CMD CMD指令用于指定一个容器启动时要运行的命令.这有点儿类似于RUN指令,只是RUN指令是指定镜像被构建时要运行的命令,而CMD是指定容器被启动时要运行的命令.这和使用docker run命令启动容器时指定要运行的命令非常类似 $ sudo docker run -i -t jamtur01/static_web /bin/true 可以认为上述命令和在Dockerfile中使用如下的CMD 指令是等效的. CMD ["/bin/true"] 选项和命

9、Dockerfile语法

??在Dockerfile中定义了很多关键字,通过关键字来完成Dockerfile的编写. ??Dockerfile官方文档 9.1 FROM ??在Dockerfile中FROM主要是指定这个Dockerfile基于哪一个base image构建.Docker Dockerfile按顺序运行指令.一个Dockerfile 必须用FROM指令启动,放在第一行. FROM scratch # 制作base image FROM centos # 使用base image FROM ubuntu:1

Docker 容器日志的那些事儿

如果时光可以倒流,现实世界的每一步都可以分解到最小,记录下来,就是日志,万物即日志. 面对历史,审视日志,可以选择忘却,也可以选择铭记:经历过的,可以选择珍藏,同样也可以让它尘封. Docker容器又何尝不是?日志就像一根时间轴,你在或者不在,他都在那.有人对其善意,有人却对其随意.如若不信,可以回忆,自己是否善待Docker容器的日志. 1.传统应用的日志 如若不是被过去伤得太深,踏入一个新的世界,应该还是会怀念过往的吧.新世界的"诱惑"与崭新的节奏,相信依旧无法掩盖旧世界的铅印.数

paas架构之docker——镜像管理

1. 镜像管理 1.1. 列出镜像 Sudo docker images 1.2. 查看镜像 Sudo docker images xxxx 1.3. 拉取镜像 Sudo docker pull ubuntu 1.4. 查找镜像 Sudo docker search mysql 1.5. 删除镜像 sudo docker rmi xxxxx (force) 1.6. 构建镜像 1.6.1. Docker commit 不推荐,建议使用docker build+ docker file 1.6.2

Kubernetes资源创建yml语法

前言 在是用kubernetes中,我们对资源的创建大部分都是通过 1 kubelet create -f RESOURCE.yaml 刚开看的时候不免有一些迷茫,看不懂语法,不知道怎么写:今天本文就介绍一下kubernetes construct语法. Construct语法其实就是由kubelet格式化成API的post data,提交给apiserver,因此这里支持yaml,json两种数据结构的文件. Pod资源 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Docker Container同时启动多服务 supervisor

Docker Container同时启动多服务 转载请注明来自:http://blog.csdn.net/wsscy2004 昨天踩了个天坑,我有一个基本的镜像centos6.5+ssh,是通过Dockerfile build的,利用CMD命令启动ssh. 通过centos6.5+ssh镜像,我想build一个rabbitmq镜像,Dockerfile中CMD启动rabbitmq服务.虽然我知道Dockerfile中的CMD只能有一个,但没想到创建另一个image,也会继承FROM image的