## 区别
* RUN:执行命令并创建新的image layer.
* CMD:设置容器启动后默认执行的命令和参数.
* ENTRYPOINT:设置容器启动时运行的命令.
## CMD
* 容器启动时默认执行的命令
* 如果docker run指定了其他命令,CMD命令被忽略
* 如果定义了多个CMD,只有最后一个会执行.
如果Dockerfile使用CMD,并且在run image的时候,加入了其他参数,那么其会被 docker run 的命令行参数指定的指令所覆盖.
### 实践
dockerfile:
```
FROM centos
ENV name docker
CMD echo "hello $name"
```
build:
```
docker build -t lzj/centos-cmd .
```
不带参数run:
```
docker run -it lzj/centos-cmd
```
结果:
```
hello docker
```
带参数run:
```
docker run -it d8e075c6605d /bin/echo "哈哈"
```
结果:
```
哈哈
```
从上面可以看出CMD的命令会被容器run时的参数替换掉.
## ENTRYPOINT
* 让容器以应用程序或服务的形式运行.
* 不会被忽略,一定会执行.
和CMD类似,但其不会被 docker run 的命令行参数指定的指令所覆盖.
### 实践
dockerfile:
```
FROM centos
ENV name docker
ENTRYPOINT echo "hello $name"
```
build:
```
docker build -t lzj/centos-entrypoint .
```
不带参数run:
```
docker run -it lzj/centos-entrypoint
```
带参数run:
```
docker run -it 6d58ec9e62bb /bin/echo "哈哈"
```
结果:
```
hello docker //ENTRYPOINT指定的命令一定是执行了的
```