ENTRYPOINT简介:


docker run命令行中指定的任何参数都会被当做参数再次传递给ENTRYPOINT指令中指定的命令。


一个Dockerfile中只能有一个ENTRYPOINT命令。如果有多条,只有最后一条有效。





无参的方式:



ENTRYPOINT [“/usr/sbin/nginx"]





指定参数的方式:





ENTRYPOINT [“/usr/sbin/nginx”, “-g”, “deamon off"]







docker run 的--entrypoint  标志可以覆盖原Dockerfile中的ENTRYPOINT  指令。




分割线:





ENTRYPOINT的两种写法:



  • docker exec的形式

ENTRYPOINT [“executable”,”param1”,”param2"]




任何docker run设置的命令参数或者CMD指令的命令,都将作为ENTRYPOINT 指令的命令参数,追加到ENTRYPOINT指令之后。




  • shell的形式



ENTRYPOINT command param1 param2 





这种格式禁止追加任何参数,即CMD指令或docker run后面的参数都将被忽略。采用shell格式,在容器中执行时,自动调用shell。





分割线:





CMD与ENTRYPOINT的关系:


  • CMD可以为ENTRYPOINT提供参数,ENTRYPOINT本身也可以包含参数,但是可以把需要变动的参数写到CMD里面,而不需要变动的参数写到ENTRYPOINT里面;
  • ENTRYPOINT使用第二种shell方式会屏蔽掉CMD里面的命令参数和docker run后面加的命令。
  • 在Dockerfile中,ENTRYPOINT指定的参数比运行docker run时指定的参数更靠前。



...
ENTRYPOINT ["echo", "foo"]







docker run CONTAINER_NAME bar







打印的结果是:





foo bar





  • 在Dockerfile中,ENTRYPOINT和CMD至少必有其一。


分割线:




ENTRYPOINT/CMD最后一条命令为无限运行的命令:


这句话才是使用ENTRYPOINT的精髓。


在Docker Daemon模式下,entrypoint、cmd命令的最后一个命令,一定是要当前容器需要一直运行的,才能防止容器退出。





以下方式无效:





ENTRYPOINT service tomcat7 start #运行几秒钟之后,容器就会退出



CMD service tomcat7 start #运行几秒钟之后,容器就会退出







以下有效:





ENTRYPOINT service tomcat7 start && tail -f /var/lib/tomcat7/logs/catalina.out



# 或者



CMD service tomcat7 start && tail -f /var/lib/tomcat7/logs/catalina.out







以下也有效:





ENTRYPOINT ["/usr/sbin/sshd"]



CMD ["-D"]




注意点:



  • ENTRYPOINT/CMD中不能把一个有限执行的命令加到一个无限执行的命令后面。这会导致后面的有限执行的命令无法执行。因为无限命令一直在执行,永远都无法执行结束,所以会导致后面的有限执行命令阻塞。
  • ENTRYPOINT/CMD中最后的一个命令必须要是无限执行的命令。
  • 比如在rabbitmq中:



第一个命令是无限执行的命令,不会主动退出。无论是rabbitmq-server还是rabbitmq-server&都是无限执行的命令,都不会主动退出。



第二个命令是有限执行的命令,执行完以后会主动退出;



rabbitmq-server 



rabbitmq-plugins enable rabbitmq_management