CMD特性:
1)启动容器默认执行的命令
2)如果docker run指定了其他命令,cmd命令会被忽略
3)如果定义了多个cmd,只有最后一个会执行
案例:
[root@master dockerfile]# cat Dockerfile
FROM alpine
LABEL mainter='test dockerfile'
LABEL auth="zhouzhiguo"
ENV name Docker
CMD echo $name
[root@master dockerfile]# docker build -t alpine:cmd-shell .
# 启动容器时,执行默认的命令,即 echo $name 输出Docker
[root@master dockerfile]# docker run -it --rm alpine:cmd-shell
Docker
# 启动容器时指定了其他命令ls,此时echo $name会被忽略,执行ls命令
[root@master dockerfile]# docker run -it --rm alpine:cmd-shell ls
bin etc lib mnt proc run srv tmp var
dev home media opt root sbin sys usr
案例: 当定义多个cmd时,只有最后一个会执行,即 echo "hello $name"会被执行 ,输出结果 hello Docker
[root@master dockerfile]# cat Dockerfile
FROM alpine
LABEL mainter='test dockerfile'
LABEL auth="zhouzhiguo"
ENV name Docker
CMD echo $name
CMD echo "hello $name"
[root@master dockerfile]# docker build -t alpine:cmd-shell-new .
[root@master dockerfile]# docker run -it --rm alpine:cmd-shell-new
hello Docker
ENTRYPOINT:启动容器正在执行的命令
1)让容器以应用或者服务的形式运行
2)不会被忽略,一定会执行
3)最佳实践,写一个shell脚本作为entrypoint
如果dockerfile中也有CMD指令,CMD中的参数会被附加到ENTRYPOINT 指令的后面。 如果这时docker run命令带了参数,这个参数会覆盖掉CMD指令的参数,并也会附加到ENTRYPOINT 指令的后面。
案例:
[root@master dockerfile]# cat Dockerfile
FROM alpine
LABEL mainter='test dockerfile'
LABEL auth="zhouzhiguo"
ENV name Docker
CMD ["Docker"]
ENTRYPOINT ["echo"]
[root@master dockerfile]# docker build -t alpine:entrypoint .
# docker run未指定参数,相当于执行 echo Docker,即输出Docker
[root@master dockerfile]# docker run -it --rm alpine:entrypoint
Docker
# dockr run指定参数,python会覆盖cmd指定参数Docker,并附追加到entrypoint指令后面,即执行echo python,输出python
[root@master dockerfile]# docker run -it --rm alpine:entrypoint python
python