前言
   
    环境:
    
     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或命令行参数
 
