目录
- 一.CMD
- 二.ENTRYPOINT
- 三.总结
一.CMD
- CMD指令为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。
- CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
- 类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:CMD 在docker run 时运行,RUN 是在 docker build时运行。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
用法
The CMD instruction has three forms:
# 用法
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)
- 用法1
带有括号的形式,这时,命令没有在任何shell终端环境下,如果我们要执行shell,必须把shell加入到括号的参数中。
FROM centos:7
CMD ["/bin/bash","-c","echo 'this is a test!'"]
采用中括号的形式,那么第一个参数必须是命令的全路径才行;而且一个dockerfile最多只能有一个cmd,如果有多个,只有最后一个生效
以上是默认的cmd,如果我们在run的时候指定了命令或者有ENTRYPOINT,那么cmd就会被覆盖
- 用法2
作为 ENTRYPOINT的参数 - 用法3
shell form,即没有中括号的形式。那么命令command默认是在“/bin/sh -c”下执行的
FROM centos:7
CMD echo "hello world !"
二.ENTRYPOINT
- 类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
- 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。
- 在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
用法
ENTRYPOINT has two forms:
# 用法
ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
ENTRYPOINT command param1 param2 (shell form)
用法1命令行模式,也就是带中括号的和cmd的中括号形式是一致的,但是这里貌似是在shell的环境下执行的,与cmd有区别。如果run命令后面有东西,那么后面的全部都会作为entrypoint的参数。如果run后面没有额外的东西,但是cmd有,那么cmd的全部内容会作为entrypoint的参数,这同时是cmd的第二种用法。
- 用法1
run后面不带参数
FROM centos:7
CMD ["this is a test !"]
ENTRYPOINT ["echo"]
run后面带参数
- 用法2
是shell模式的。在这种模式下,任何run和cmd的参数都无法被传入到entrypoint里。
FROM centos:7
CMD ["this is a test !"]
ENTRYPOINT echo
三.总结
CMD设置的指令在镜像运行时自动运行,无法追加指令,只能把指令全部覆盖
ENTRYPOINT设置的指令在镜像运行时与CMD一样,可以在新建镜像时设置的指令后追加新的指令,也可以使用 --entrypoint 覆盖指令。