这里说明一下,如:docker run -it ubuntu /bin/bash 命令的参数是指/bin/bash 而非 -it ,-it只是docker 的参数,而不是容器的参数。
同样是上面的ec镜像启动:
docker run ec /bin/echo hello
就不会输出:this is a echo test,因为CMD命令被”/bin/bash”覆盖了。
FROM busybox
CMD ["/bin/echo", "this is a echo test"]
[root@localhost df]# docker build -t test .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM busybox
---> 6ad733544a63
Step 2/2 : CMD /bin/echo this is a echo test
---> Running in fa8af9fca520
---> c653707895ae
Removing intermediate container fa8af9fca520
Successfully built c653707895ae
Successfully tagged test:latest
[root@localhost df]# docker run test
this is a echo test
[root@localhost df]# docker run test /bin/echo hello
hello
三 一些说明和注意
一个Dockerfile仅仅最后一个CMD起作用。
执行文件或者没有执行文件(ENTRYPOINT提供),为执行容器提供缺省值。
如果CMD配合ENTRYPOINT那么他们的格式都需要是json数组格式,CMD用来提供参数。
CMD非参数模式,shell exec 当运行一个镜像的时候会执行。
shell格式 相当于指令在/bin/sh -c执行,如果不想使用shell格式,就需要使用数组格式,参数为单独字符串。
FROM ubuntu
CMD echo "This is a test." | wc -
一 Docker的CMD指令The main purpose of a CMD is to provide defaults for an executing container.CMD在容器运行的时候提供一些命令及参数,用法如下:CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD
和ENTRYPOINT同样作为容器启动时执行的命令,区别有以下几点:
CMD
的命令会被
docker
run 的命令覆盖而ENTRYPOINT不会
如使用
CMD
["/bin/bash"]或ENTRYPOINT ["/bin/bash"]后,再使用
docker
run -ti image启动容器,它会自动进入容器内部的交互终端,如同使用
docker
run -ti image /bin/bash。
但是如果启动镜像的命令为
docker
run -ti image /bin/ps,使用
CMD
后面的命令
CMD
["executable","param1","param2"](execform, this is the preferred form)
CMD
["param1","param2"](asdefault parameters to ENTRYPOINT)
CMD
command param1 param2(shellfor...
昨天用
Dockerfile
来启动mongodb的集群,启动参数--replSet死活没执行,最后就决定研究一哈
cmd
和entrypoint。但是上网看了一些资料个人觉得讲的不好,还是没有说出根本的东西,决定自己研究并且整理一哈。
首先上
docker
官网:https://docs.
docker
.com/engine/reference/builder/#
cmd
感觉官网关于这两个命令讲的简直不要
ARG a_name
ARG a_nother_name=a_default_value
ARG
指令
定义的参数,在
docker
build命令中以--build-arg a_name=a_value形式赋值。
如果
docker
build命令传递的参数,在
Dockerfile
中没有对应的参数,将抛出如下警告:
格式:
CMD
commandparam1 param2 (shell模式)
CMD
["executable","param1","param2"] (exec模式)推荐
最近又在写
Dockerfile
,在写的过程中对
CMD
又测试了很多,对应的还有个ENTRYPOINT,也在网上找了很多资料,大概总结如下
先来大概说下
Dockerfile
中可以执行命令的
指令
,以下非原创,有出处
Dockerfile
中RUN,
CMD
和ENTRYPOINT都能够用于执行命令,下面是三者的主要用途:
RUN命令执行命令并创建新的镜像层,通常用于安装软件包
CMD
命令设...
CMD
的作用是作为执行container时候的默认行为(容器默认的启动命令)
当运行container的时候声明了command,则不再用image中的
CMD
默认所定义的命令
一个
Dockerfile
中只能有一个有效的
CMD
,当定义多个
CMD
的时候,只有最后一个才会起作用
CMD
定义的三种方式:
CMD
<
cmd
> 这个会当作/...
Dockerfile
是一种文本文件,其中包含构建
Docker
映像所需的
指令
和配置选项。
CMD
是其中的一种
指令
,用于设置容器启动时默认执行的命令。
在
Dockerfile
中,可以使用
CMD
指令
来指定容器启动后要执行的命令。如果在
Dockerfile
中使用了多个
CMD
指令
,只有最后一个
指令
会生效。
CMD
指令
可以用以下三种格式之一来指定要执行的命令:
1.
CMD
["executable","param1","param2"]
这种格式使用JSON数组的形式指定要执行的命令。第一个元素是要执行的可执行文件或脚本,后面的元素是它需要接收的参数。中括号是必要的,元素之间用逗号隔开。
2.
CMD
command param1 param2
这种格式使用命令行的形式指定要执行的命令。命令本身会被解释为可执行文件的路径,后面的参数会作为它的参数发送。必须将整个命令包含在引号中。
3.
CMD
["param1","param2"]
这种格式使用在ENTRYPOINT
指令
中定义的命令的默认参数。也可以用作在交互式shell中运行的默认命令。
总之,
CMD
指令
是
Dockerfile
中一个非常有用的
指令
,可以为容器指定默认命令,从而方便地管理容器。