ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Dockerfile 的 CMD 和 ENTRYPOINT 区别与联系

2021-10-14 14:34:00  阅读:225  来源: 互联网

标签:run CMD echo ENTRYPOINT test Dockerfile localhost


一、CMD 和 ENTRYPOINT 使用方法

CMD 命令的三种用法:

The CMD instruction has three forms:
 
# exec 形式,这是首选形式,即官方推荐
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
# 作为 ENTRYPOINT 的参数
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
# shell 形式
CMD command param1 param2 (shell form)

ENTRYPOINT 命令的两种用法:

ENTRYPOINT has two forms:
# exec 形式,这是首选形式,即官方推荐
ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
# shell 形式
ENTRYPOINT command param1 param2 (shell form)

二、示例

1、CMD 和 ENTRYPOINT 都可以作为容器启动的运行的命令。

容器启动运行 CMD 命令

Dockerfile:

FROM alpine
CMD ["/bin/sh", "-c", "echo 'hello cmd'"] # 等价于 CMD echo "hello cmd"

制作镜像:

[root@localhost test]# docker build -t hausen1012/test .
# 构建过程....

启动容器:

[root@localhost test]# docker run hausen1012/test
hello cmd
容器启动运行 ENTRYPOINT 命令

Dockerfile:

FROM alpine
ENTRYPOINT ["/bin/sh", "-c", "echo 'hello entrypoint'"] # 等价于 ENTRYPOINT echo "hello entrypoint" 

制作镜像:

[root@localhost test]# docker build -t hausen1012/test2 .
# 构建过程....

启动容器:

[root@localhost test]# docker run hausen1012/test2
hello entrypoint

结果:都能作为容器启动执行的命令。

2、多个 CMD 和 ENTRYPOINT 命令最后一条才生效

多个 CMD 命令

Dockerfile:

FROM alpine
CMD echo 111
CMD echo 222
CMD echo 333

制作镜像:

[root@localhost test]# docker build -t hausen1012/test3 .
# 构建过程....

启动容器:

[root@localhost test]# docker run hausen1012/test3
333
容器启动运行 ENTRYPOINT 命令

Dockerfile:

FROM alpine
ENTRYPOINT echo 111
ENTRYPOINT echo 222
ENTRYPOINT echo 333

制作镜像:

[root@localhost test]# docker build -t hausen1012/test4 .
# 构建过程....

启动容器:

[root@localhost test]# docker run hausen1012/test4
333

结果:同时写多个 CMD 或 ENTRYPOINT 只有最后一条生效


上面都是一样的,两个命令没有任何区别。下面讲讲区别。

3、Docker run 覆盖启动命令

容器启动时尝试覆盖 CMD 命令

Dockerfile:

FROM alpine
CMD ["/bin/sh", "-c", "echo 'hello cmd'"]

制作镜像:

[root@localhost test]# docker build -t hausen1012/test5 .
# 构建过程....

启动容器:

[root@localhost test]# docker run hausen1012/test5 echo "changed by run"
changed by run

可以看见本该输出 hello cmd,变成了 changed by run。

容器启动运行 ENTRYPOINT 命令

Dockerfile:

FROM alpine
ENTRYPOINT ["/bin/sh", "-c", "echo 'hello entrypoint'"]

制作镜像:

[root@localhost test]# docker build -t hausen1012/test6 .
# 构建过程....

启动容器:

[root@localhost test]# docker run hausen1012/test6 echo "changed by run"
hello entrypoint

可以看见,还是原来的输出。

结果:CMD 执行的启动命令可以被 Docker run 覆盖,但是 ENTRYPOINT 则不行。

4、CMD 作为 ENTRYPOINT 的参数

Dockerfile:

FROM alpine
CMD ["I am cmd"]
ENTRYPOINT ["echo"]

制作镜像:

[root@localhost test]# docker build -t hausen1012/test7 .
# 构建过程....

启动容器:

[root@localhost test]# docker run hausen1012/test7
I am cmd
[root@localhost test]# docker run hausen1012/test7 "I am run"
I am run

结果:CMD 可以作为 ENTRYPOINT 的参数,当 Docker run 传递参数时,会覆盖掉 CMD 的参数。

多个 CMD 传参时,只有最后一个 CMD 有效。

注意:

alpine 镜像里面没有 bash,即:
使用 CMD ["/bin/bash", “-c”, “echo ‘hello cmd’”] 会报错,
使用 CMD ["/bin/sh", “-c”, “echo ‘hello cmd’”] 则能正常输出。

标签:run,CMD,echo,ENTRYPOINT,test,Dockerfile,localhost
来源: https://blog.csdn.net/never_late/article/details/120762139

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有