云计算-8-Dockerfile深度解析全

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

云计算-8-Dockerfile深度解析



ARG和ENV


ARG


ENV


**RUN 和 ENTRYPOINT**区别


**使用 RUN 指令安装应用和软件包,构建镜像**


**ENTRYPOINT配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行 `docker run`时指定了其他命令)**


**ADD和COPY**


COPY


ADD


**EXPOSE**


ARG和ENV

ARG

ARG用于设置环境变量,只在build期间生效,run期无效


  • 例子:构建arg_1的Dockerfile,我们还是以nginx为例,
FROM nginx
ARG arg1=22222
RUN   echo 'echo "<h1>$1, Docker!</h1>" > /usr/share/nginx/html/index.html'  > ./entrypoint.sh  \
        && chmod +rwx ./entrypoint.sh  \
        && ./entrypoint.sh $arg1



  • 以上例子,我们构建镜像
docker build -t mynginx:v1  -f /root/arg_1 .


  • 运行镜像
docker run -it --name mynginx_arg1 -p 8881:80 -d mynginx:v1


  • 看出运行结果:

ARG指定的变量,在构建镜像的时候使用--build-arg <参数名> =值进行传递,会覆盖Dockerfile 中指定的同名参数



Dockerfile脚本还是上面的脚本,不过就是我们在构建的时候进行传递参数

  • 使用–build-arg传递ARG设置的参数
docker build -t mynginx:v2 --build-arg arg1=hahahah -f /root/arg_1 .


  • 运行 mynginx:v2镜像
docker run -it --name mynginx_arg2 -p 8882:80 -d mynginx:v2



6508da65d19bf238927f5dd5be5879a4.png


灵活使用ARG指令,可以在不修改Dockerfile的情况下,构建不同镜像

就像上面展示的,我们可以在构建镜像的时候,给参数传递不同的值,构建出不同的镜像

ENV


存在两种格式

  • ENV
  • ENV==…

ENV指令和ARG指令特别相似,ARG在build的时候生效,ENV在 run的时候生效,都可以直接使用这里定义的环境变量。


docker run --env 可以修改这些值

  • 构建env_1的Dockerfile,我们还是以nginx为例
FROM nginx
ARG arg1=1111
ENV arg2=2222
RUN    echo 'echo "<h1>$1,$2, Docker!</h1>" > /usr/share/nginx/html/index.html'  > ./entrypoint.sh  \
        && chmod +rwx ./entrypoint.sh  \
        && ./entrypoint.sh $arg1 $arg2  


  • 构建镜像
docker build -t mynginx:v3 --build-arg arg1=envtest -f /root/env_1 .



  • 运行mynginx:v3镜像
docker run -it --name mynginx_env1 -p 8883:80 --env arg2=envtest2 -d mynginx:v3


  • 查看结果



97e5d5e24beefdee657c6832f60c66cd.png


我们发现我们在docker run的时候使用--env的时候修改了arg2参数,但是没有生效

为什么我们在docker run使用–env指令的时候没有生效呢?这是因为Dockerfile中RUN 和 ENTRYPOINT存在区别


RUN 和 ENTRYPOINT区别

使用 RUN 指令安装应用和软件包,构建镜像

从上面 的ENV和ARG构建镜像的例子我们可以看出来,RUN是在构建镜像的时候生效的,生效以后文件已经生效,在docker run的时候,指令就不能再修改参数了


ENTRYPOINT配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行 docker run时指定了其他命令)

  • 修改Dockerfile文件env_1为env_2脚本如下
FROM nginx
ENV arg2=2222
ENTRYPOINT  echo 'echo "<h1>$1, Docker!</h1>" > /usr/share/nginx/html/index.html'  > ./entrypoint.sh  \
        && chmod +rwx ./entrypoint.sh  \
        && ./entrypoint.sh $arg2  \ 
        && exec nginx -g 'daemon off;'


  • 构建镜像
docker build -t mynginx:v4 --build-arg  -f /root/env_2 .



  • 运行mynginx:v4
docker run -it --name mynginx_env4 -p 8884:80 --env arg2=envtest2 -d mynginx:v4

5371fb71927746902d05eb5f817b3652.png


格式:


COPY [–chown=:] <源路径>… <目标路径>


COPY [–chown=:] ["<源路径1>",… “<目标路径>”]


它和RUN一样,有两种格式,一种类似命令,一种类似函数调用,COPY指令将从构建上下文目录源路径的文件、目录复制到新的一层


镜像内的 <目标路径> 位置。


构建镜像文件copy_1

FROM nginx
COPY index.html /usr/share/nginx/html/index.html


  • 创建index.html
vi index.html


index.html内容

<h1>copy test, Docker!</h1>


  • 构建镜像
docker build -t mynginx:v5  -f /root/add/copy_1 .


  • 运行镜像
docker run -it --name mynginx_copy -p 8885:80 -d mynginx:v5


查看运行结果


1155725fc59a95ac2cb19ca930a3d80a.png


ADD


同COPY用法,不过 ADD拥有自动下载远程文件和解压的功能。


src 路径必须在构建的上下文中;不能使用 …/something /something 这种方式,因为docker


构建的第一步是将上下文目录(和子目录)发送到docker守护程序。


如果 src 是URL,并且 dest 不以斜杠结尾,则从URL下载文件并将其复制到 dest 。


如果 dest 以斜杠结尾,将自动推断出url的名字(保留最后一部分),保存到 dest


如果 src 是目录,则将复制目录的整个内容,包括文件系统元数据。


EXPOSE


格式为 EXPOSE <端口1> [<端口2>...]。


EXPOSE指令通知Docker容器在运行时在指定的网络端口上进行侦听。可以指定端口是侦听TCP还

是UDP,如果未指定协议,则默认值为TCP。


EXPOSE指令实际上不会发布端口。它充当构建映像的人员和运行容器的人员之间的一种文档,即

有关打算发布哪些端口的信息。要在运行容器时实际发布端口,请在docker run上使用-p标志发布


并映射一个或多个端口,或使用-P标志发布所有公开的端口并将其映射到高阶端口


如果您觉得本文不错,欢迎关注,点赞,收藏支持,您的关注是我坚持的动力!

目录
相关文章
|
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月前
|
云计算 开发者 Docker
揭秘云计算中的容器化技术——Docker的深度解析
【10月更文挑战第6天】揭秘云计算中的容器化技术——Docker的深度解析
|
5月前
|
存储 算法 Java
Java中的集合框架深度解析云上守护:云计算与网络安全的协同进化
【8月更文挑战第29天】在Java的世界中,集合框架是数据结构的代言人。它不仅让数据存储变得优雅而高效,还为程序员提供了一套丰富的工具箱。本文将带你深入理解集合框架的设计哲学,探索其背后的原理,并分享一些实用的使用技巧。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往高效编程的大门。
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
86 2
|
9天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
9天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

推荐镜像

更多