前言
环境:
centos7.9 docker version 20.10.14
在
Dockerfile
中最容易让人混淆的是
CMD
和
ENTRYPOINT
这两个指令,本篇我们来介绍这两个指令的用法和区别。
CMD 指定容器启动时默认运行命令
如果
docker run
指定了其他命令,
CMD
指定的默认命令将会被忽略掉;
如果
Dockerfile
存在多个
CMD
指令,则只有最后一个
CMD
有效;
1、exec格式:CMD ["executable","param1","param1"] 这是CMD的推荐格式
2、CMD ["param1","param1"] 为ENTRYPOINT提供额外的参数,此外ENTRYPOINT 必须使用exec格式
3、shell格式:CMD command param1 param2
演示示例:
CMD ["echo","Hello world"]
docker run -it [image]
Hello world #输出结果
CMD echo "Hello world"
docker run -it [image]
Hello world #输出结果
docker run -it [image] /bin/bash #CMD命令会被忽略
/: #进入到容器内了
CMD ["/bin/sh","-c","echo hello,$name"] #-c表示解析变量
ENTRYPOINT 指定容器启动时运行的命令
ENTRYPOINT
指令也是指定容器启动时运行的命令,如果
Dockerfile
存在多个
ENTRYPOINT
指令,则只有最后一个
ENTRYPOINT
有效;
ENTRYPOINT
与
CMD
很类似,但是
ENTRYPOINT
一定不会被忽略,一定会执行;
1、exec格式:ENTRYPOINT ["executable","param1","param1"] 这是ENTRYPOINT 的推荐格式
ENTRYPOINT的exec格式用于设置要执行的命令和参数,同时可通过CMD提供额外的参数
2、shell格式:ENTRYPOINT command param1 param2
注意:ENTRYPOINT的shell格式会忽略任何CMD或docker run提供的参数
ENTRYPOINT
中的参数始终会被使用,而
CMD
中的额外参数可以在容器启动时动态替换掉。
如果
Dockerfile
文件既有
CMD
,又有
ENTRYPOINT
,那么
CMD
将会被当做参数传递给
ENTRYPOINT
。
演示示例:
CMD ["World"]
ENTRYPOINT ["/bin/echo","Hello"]
docker run -it [images] #启动容器,输出结果如下
Hello World
CMD ["World"]
ENTRYPOINT ["/bin/echo","Hello"]
docker run -it [images] Man #在命令行指定参数,启动容器,输出结果如下
Hello Man #CMD被命令行参数忽略掉了,所以输出就是Hello Man
CMD ["World"]
ENTRYPOINT "/bin/echo" "Hello" #使用shell格式
docker run -it [images] #启动容器,输出结果如下
Hello #shell格式的ENTRYPOINT会忽略任何CMD或命令行参数
docker run -it [images] Man #即使在命令行指定参数,启动容器,输出结果如下
Hello #shell格式的ENTRYPOINT会忽略任何CMD或命令行参数