Docker: 精通ENTRYPOINT指令

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

你可能感兴趣的:(docker)