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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 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标志发布所有公开的端口并将其映射到高阶端口


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

目录
相关文章
|
20天前
|
存储 应用服务中间件 云计算
深入解析:云计算中的容器化技术——Docker实战指南
【10月更文挑战第14天】深入解析:云计算中的容器化技术——Docker实战指南
50 1
|
28天前
|
云计算 开发者 Docker
揭秘云计算中的容器化技术——Docker的深度解析
【10月更文挑战第6天】揭秘云计算中的容器化技术——Docker的深度解析
|
3月前
|
存储 算法 Java
Java中的集合框架深度解析云上守护:云计算与网络安全的协同进化
【8月更文挑战第29天】在Java的世界中,集合框架是数据结构的代言人。它不仅让数据存储变得优雅而高效,还为程序员提供了一套丰富的工具箱。本文将带你深入理解集合框架的设计哲学,探索其背后的原理,并分享一些实用的使用技巧。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往高效编程的大门。
|
3月前
|
存储 边缘计算 安全
边缘计算与云计算的协同工作:技术解析与应用前景
【8月更文挑战第4天】边缘计算与云计算的协同工作是未来信息技术发展的重要趋势。通过合理地分配任务和资源,两者可以相互补充、发挥各自的优势,实现更高效的数据处理和分析。这种协同模式不仅提高了系统的性能和可靠性,还满足了复杂多变的应用需求,为人工智能、物联网等技术的发展提供了强有力的支持。
205 11
|
4月前
|
弹性计算 负载均衡 网络协议
云计算中的弹性伸缩与负载均衡技术解析
【7月更文挑战第4天】弹性伸缩与负载均衡作为云计算平台中的两大关键技术,对于构建高可用、可扩展的应用系统具有重要意义。通过合理利用这两种技术,企业可以灵活应对不断变化的业务需求,降低运营成本,提高资源利用效率。未来,随着技术的不断进步和应用的深入,弹性伸缩与负载均衡技术将在更多领域发挥重要作用,推动云计算技术的持续发展。
|
28天前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
62 0
|
28天前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
49 0
|
28天前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
58 0
|
28天前
|
安全 Java 程序员
Collection-Stack&Queue源码解析
Collection-Stack&Queue源码解析
72 0
|
8天前
|
消息中间件 缓存 安全
Future与FutureTask源码解析,接口阻塞问题及解决方案
【11月更文挑战第5天】在Java开发中,多线程编程是提高系统并发性能和资源利用率的重要手段。然而,多线程编程也带来了诸如线程安全、死锁、接口阻塞等一系列复杂问题。本文将深度剖析多线程优化技巧、Future与FutureTask的源码、接口阻塞问题及解决方案,并通过具体业务场景和Java代码示例进行实战演示。
27 3

热门文章

最新文章

推荐镜像

更多