一般来说一个软件的镜像的最后由`ENTRYPOINT`和`CMD`来构成,有的镜像可能没有`ENTRYPOINT`,
`ENTRYPOINT`和`CMD`的主要区别在于即使你在运行镜像时指定了“命令”
(e.g. `docker run nginx echo "test"`的`echo "test"`部分就是“命令”),`ENTRYPOINT`中
指定的命令(e.g. `ENTRYPOINT entrypoint.sh`)也不会被忽略。
总的来说,可以把以下几条规则当做创作Dockerfile的thumb rules:
- `RUN`: 用来安装软件或添加依赖,因为`RUN`会创建一层`layer`。
- `ENTRYPOINT`: 用来指定该镜像为可执行程序,并且指定一个一个脚本用来初始化基础环境(
e.g. 创建镜像运行时所使用的用户、加载程序的依赖、初始化环境变量等。)。
- `CMD`: 用来运行软件。
- `ENTRYPOINT`与`CMD`结合使用:
在`ENTRYPOINT entrypoint.sh`中初始化环境,最后执行`exec "$@"`,以此来继续执行
`CMD`中的内容。