RUN和CMD和ENTRYPOINT
前言
Docker
有三种命令执行方式
RUN
: 执行命令并创建新的Image Layer
CMD
: 设置容器启动后默认执行的命令和参数ENTRYPOINT
: 设置容器启动时运行的命令
RUN
RUN
命令一般用来安装一些依赖, 删除缓存等操作.
但是每一次RUN
都会产生一层Image Layer
, 所以需要尽可能的少用RUN
, 尽量一行代码搞定.
1 | RUN yum update && yum install -y vim |
CMD
CMD
是container
启动时默认执行的命令.
等价于docker run -it [image] /bin/bash
.
并且会被覆盖.
- 多个CMD只会执行最后一个.
- 外部命令会覆盖内部的
CMD
.
利用外部命令会覆盖内部CMD
的特性, 我们可以从外部传入参数.
1 | FROM centos |
然后执行以下命令
1 | docker build -t centos-curl . |
等价于在container
中执行/usr/bin/curl --head www.baidu.com
.
ENTRYPOINT
ENTRYPOINT
让container
以应用程序或者服务的形式运行.
和CMD
相比, ENTRYPOINT
不会被忽略, 一定会执行.
最佳实践就是写一个shell
作为ENTRYPOINT
1 | COPY docker-entrypoint.sh /usr/local/bin |
参数格式 SHELL 和 EXEC
另外, RUN
和CMD
和ENTRYPOINT
的参数规则有两种, SHELL
和 EXEC
.
以ENTRYPOINT
为例, 这两种ENTRYPOINT
的写法是等价的.
1 | FROM centos |
总结
- 使用
RUN
安装软件依赖, 并记得删除缓存. - 构建服务时使用
Exec
格式的ENTRYPOINT
. - 默认启动命令使用
CMD
.