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 |
浙公网安备 33010602011771号