云计算-7-Dockerfile深度解析CMD和ENTRYPOINT指令

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 云计算-7-Dockerfile深度解析CMD和ENTRYPOINT指令

云计算-7-Dockerfile深度解析

CMD

CMD指令


Docker不是虚拟机,Docker镜像启动后就是容器,容器是进程,启动的时候需要指定运行的程序和参数,CMD指令的作用就是用于指定容器进程启动命令,其格式和我们之前在云计算-6-Dockerfile制作镜像中介绍的RUN指令很相似,有两种格式,三种写法:


shell格式:CMD command arg1 arg2


exec格式:CMD [“可执行文件”,“arg1”,“arg2”]


CMD [“agr1”,“arg2”],为 ENTRYPOINT 提供默认参数

例子1

vi mynginx



文件dockerfile内容

FROM nginx:1.21.6RUN echo '<h1>Welcome My Docker!</h1>' > /usr/share/nginx/html/index.htmlCMD echo 'hello docker'


打包镜像

docker build -t mynginx:v3  -f /root/mynginx_3 .


运行镜像

docker run -it --name mynginx_3 -p 8083:80  mynginx:v3


结果

:如果添加**-d**,

docker run -it --name mynginx_3 -p 8083:80 -d mynginx:v3

0c91457d3a1a9de63438c845a2316d94.png


我们可以使用,docker logs查看容器日志

docker logs mynginx_3
• 1

结果为



例子2

我们使用以centos为基础镜像,使用yum的方式构建nginx,Dockerfile的进步如下:

FROM centosRUN cd /etc/yum.repos.d/ RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*RUN yum clean allRUN yum install -y yum-utilsRUN yum install -y nginxRUN echo 'hello world' > /usr/share/nginx/html/index.htmlEXPOSE 80CMD ["/usr/sbin/nginx", "-g","daemon off;"]


  • 打包镜像
docker build -t mynginx:v1 .
• 1
  • 运行镜像
docker run -it --name mynginx_1  -p 8080:80 -d  mynginx:v1


查看结果

提示:

很多人在上面的Dockerfile中经常将cmd写为

CMD service nginx start

然后发现容器执行后立即退出了,甚至还在容器中使用systemctl命令,然后发现这个命令执行不了,这主要是没有分清楚前后台概念,没有区分容器和虚拟机的差异

对于容器,他启动程序就是容器的应用进程,容器就是为主进程存在的,主进程退出,容器就也退出了。


如果使用 CMD service nginx start 实际上就是使用

CMD ['sh','-c','service nginx start']



主进程实际上就是sh,当service nginx start命令结束, sh主进程也就结束了,容器自然就退出了。

ENTRYPOINT

ENTRYPOINT指令


ENTRYPOINT的格式和RUN的指令是一样的,分为 exec 格式和 shell 格式:


shell格式:command param1 param2 (shell 形式)


exec格式:ENTRYPOINT [“executable”, “param1”, “param2”] ( exec 方式, 首选方式)


ENTRYPOINT目的和CMD一样,都是在指定容器启动程序和启动程序的参数,在运行时参数可以替代

例子3

FROM centosRUN cd /etc/yum.repos.d/RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*RUN yum clean allRUN yum install -y yum-utils#RUN yum makecache fastRUN yum install -y nginxRUN echo 'hello world' > /usr/share/nginx/html/index.htmlEXPOSE 80ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]


如果我们启动nginx的时候想查看nginx的版本

此处的-v,就是nginx -v。


当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为:

<ENTRYPOINT> "<CMD>"



例子四

FROM centosRUN cd /etc/yum.repos.d/RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*RUN yum clean allRUN yum install -y yum-utils#RUN yum makecache fastRUN yum install -y nginxRUN echo 'hello world' > /usr/share/nginx/html/index.htmlEXPOSE 80CMD ["-g","daemon off;"]ENTRYPOINT ["/usr/sbin/nginx"]


实际例子4含义和例子三是一样的。


提示

只能有一个CMD


  • Dockerfile中只能有一条CMD指令。如果您列出多个CMD,则只有最后一个CMD才会生效。
  • CMD的主要目的是为执行中的容器提供默认值。这些默认值可以包含可执行文件,也可以省略可执行文件,在这种情况下,您还必须指定ENTRYPOINT指令。


CMD为ENTRYPOINT提供默认参数


  • 如果使用CMD为ENTRYPOINT指令提供默认参数,则CMD和ENTRYPOINT指令均应使用JSON数组格式指定。

docker run启动参数会覆盖CMD内容

# 一个示例 FROM alpine LABEL maintainer=leifengyang CMD ["1111"] ENTRYPOINT ["echo"] #构建出如上镜像后测试 docker run xxxx:什么都不传则 echo 1111echo 1111 docker run xxx arg1:传入arg1 则echo arg1


目录
相关文章
|
2月前
|
运维 持续交付 云计算
深入解析云计算中的微服务架构:原理、优势与实践
深入解析云计算中的微服务架构:原理、优势与实践
70 1
|
10天前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
160 75
|
16天前
|
JSON Shell Linux
dockerfile 用法全解析
Dockerfile指令简介:`FROM`基于Alpine镜像;`WORKDIR`设置工作目录;`COPY`复制文件;`ADD`支持URL;`RUN`运行命令;`CMD`容器启动时执行;`ENTRYPOINT`与`CMD`组合执行;`EXPOSE`声明端口;`VOLUME`映射文件;`ENV`设置环境变量;`ARG`构建参数;`LABEL`元数据;`ONBUILD`触发命令;`STOPSIGNAL`停止信号;`HEALTHCHECK`健康检查;`SHELL`默认Shell。Alpine仅5M,小巧高效。
48 4
dockerfile 用法全解析
|
2月前
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
116 3
|
3月前
|
存储 应用服务中间件 云计算
深入解析:云计算中的容器化技术——Docker实战指南
【10月更文挑战第14天】深入解析:云计算中的容器化技术——Docker实战指南
92 1
|
3月前
|
JSON JavaScript 前端开发
Javaweb中Vue指令的详细解析与应用
Vue指令提供了一种高效、声明式的编码方式,使得开发者可以更专注于数据和业务逻辑,而不是DOM操作的细节。通过熟练使用Vue指令,可以极大地提高开发效率和项目的可维护性。
28 3
|
3月前
|
云计算 开发者 Docker
揭秘云计算中的容器化技术——Docker的深度解析
【10月更文挑战第6天】揭秘云计算中的容器化技术——Docker的深度解析
|
29天前
|
存储 安全 网络安全
云计算与网络安全:技术融合的双刃剑
在数字化浪潮中,云计算如同一股不可阻挡的力量,推动着企业和个人用户步入一个高效、便捷的新时代。然而,随之而来的网络安全问题也如影随形,成为制约云计算发展的阿喀琉斯之踵。本文将探讨云计算服务中的网络安全挑战,揭示信息保护的重要性,并提供实用的安全策略,旨在为读者呈现一场技术与安全的较量,同时指出如何在享受云服务带来的便利的同时,确保数据的安全和隐私。
27 6
|
28天前
|
存储 人工智能 安全
云计算与网络安全:技术融合与挑战
在数字化时代的浪潮中,云计算和网络安全已成为推动社会进步的两大关键技术。本文将探讨云计算服务的发展,网络安全的重要性,以及信息安全技术的演进。我们将通过实例分析,揭示云服务如何增强数据保护,网络安全措施如何应对新兴威胁,以及信息安全技术的创新如何为企业带来竞争优势。文章旨在为读者提供对云计算和网络安全领域的深入理解,并展示它们如何共同塑造我们的未来。
|
27天前
|
监控 安全 网络安全
云计算与网络安全:技术挑战与解决方案
随着云计算技术的飞速发展,其在各行各业的应用越来越广泛。然而,随之而来的网络安全问题也日益凸显。本文将从云服务、网络安全和信息安全等技术领域出发,探讨云计算面临的安全挑战及相应的解决方案。通过实例分析和代码示例,旨在帮助读者更好地理解云计算与网络安全的关系,提高网络安全防护意识。

热门文章

最新文章

推荐镜像

更多