CMD和ENTRYPOINT

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

 

posted @ 2022-06-25 17:35  Linux_Boy  阅读(170)  评论(0编辑  收藏  举报