cmd与entrypoint的区别

  • Post author:
  • Post category:其他




前言

环境:

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或命令行参数



版权声明:本文为MssGuo原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。