## 區別
* 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指定的命令一定是執行了的
```