dockerfile深入学习之ENTRYPOINT

ENTRYPOINT:配置容器启动后执行的命令,不可被docker run 提供的参数覆盖

语法形式:

  • ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
  • ENTRYPOINT command param1 param2 (shell form)

 实例:

  • docker run -i -t --rm -p 80:80 nginx  容器启动后启动nginx 监听80端口

NOTE:

  • docker run <image>的命令行参数将会被添加到ENTRYPOINT exec形式下所有的参数之后、并会覆盖所有CMD指定的参数
  • 可以通过docker run —entrypoint标签覆盖ENTRYPOINT指定的参数
  • 如果Dockerfile中存在多个ENTRYPOINT命令,只有最后一个有效

EXEC FORM:

  • ENTRYPOINT的exec形式可以用于设置基本不会被更改的默认命令和参数、至于可能会被改变的默认值可以通过CMD指令来设置
  • docker stop 进程名 可以平滑关闭某一进程
  • exec form不会调用shell命令,所以如果写成:ENTRYPOINT [ "echo", "$HOME" ] 则其中的$HOME不会被解析,如果想要获取$HOME的值、可以通过 ENTRYPOINT [ "sh", "-c", "echo $HOME" ] 来实现
  • 在使用exec形式执行一个shell的时候、环境变量的解析是由shell实现、而不是docker

SHELL FORM:

  • shell形式使用shell进程替代了环境变量中的shell,通过此方式会忽略CMD和docker run 命令行参数

理解CMD和ENTRYPOINT的交互:

  • CMD和ENTRYPOINT指令都定义了运行容器时执行的命令
  • 交互规则:
    • dockerfile至少要指定一个CMD或者ENTRYPOINT命令
    • 将容器当作可执行程序使用时应该定义ENTRYPOINT
    • 应使用CMD作为定义ENTRYPOINT命令的默认参数或在容器中执行ad-hoc命令的一种方法
    • CMD会被docker run 覆盖
    • 详情见表:

 

No ENTRYPOINT

ENTRYPOINT exec_entry p1_entry

ENTRYPOINT [“exec_entry”, “p1_entry”]

No CMD

error, not allowed

/bin/sh -c exec_entry p1_entry

exec_entry p1_entry

CMD [“exec_cmd”, “p1_cmd”]

exec_cmd p1_cmd

/bin/sh -c exec_entry p1_entry

exec_entry p1_entry exec_cmd p1_cmd

CMD [“p1_cmd”, “p2_cmd”]

p1_cmd p2_cmd

/bin/sh -c exec_entry p1_entry

exec_entry p1_entry p1_cmd p2_cmd

CMD exec_cmd p1_cmd

/bin/sh -c exec_cmd p1_cmd

/bin/sh -c exec_entry p1_entry

exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd

posted on 2018-01-18 17:16  残天  阅读(1342)  评论(0)    收藏  举报

导航