当前位置: 首页 > news >正文

Docker:镜像构建 DockerFile

Docker:镜像构建 DockerFile

    • 镜像构建
      • docker build
    • Dockerfile
      • FROM
      • COPY
      • ENV
      • WORKDIR
      • ADD
      • RUN
      • CMD
      • ENTRYPOINT
      • USER
      • ARG
      • VOLUME


镜像构建

Docker官方提供的镜像中,大部分都是基础镜像,他们只提供某个简单的功能,如果想要一个功能更加丰富的镜像,就需要自己制作。

比如说一个容器配置完毕后,想要让容器便于传输,就可以封装为一个镜像。或者说希望让自己的容器可以被别人看到,提交到仓库上去,也要先变为镜像。

Docker指令中,docker commit可以使用快照的形式快速制作一个镜像,它直接将一个容器导出为镜像。除此之外,Docker还提供了另一种方式构建镜像:编写Dockerfile

Dockerfile是一个文件,首字母大小写任意,依据这个文件,就可以构建出一个镜像。在联网的状态下,只要有这个文件,就可以构建出任意的镜像。


docker build

docker bild命令可以读取Dockerfile文件,并依据文件构建镜像。

语法:

docker build [option] path

参数:

  • -f:指定要使用的Dockerfile路径,默认为当前目录下的Dockerfile文件
  • -t:指定镜像的名称与标签

具体使用,在稍后Dockerfile编写时一起讲解。


Dockerfile

Dockerfile是一个文本文件,内部包含多条指令,这些指令描述了如何构建一个镜像,如果构建的镜像不符合要求,还可以修改Dockerfile反复制作镜像。

Dockerfile的不区分大小写,后续的指令都以大写形式。

Dockerfile使用#进行注释:

# 这是一行注释

FROM

  • 功能:指定一个基础镜像

语法:

FROM image[:tag] [AS name]

指定镜像时,可以使用as对这个镜像重命名,这样可以在一个DockerFile中进行多级构建,这个稍后会讲解。

示例:

FROM ubuntu:22.04 AS ubt1
FROM ubuntu:22.04 AS ubt2

使用FROM指定基础镜像时,如果基础镜像不存在,那么会自动拉取。


COPY

  • 功能:从宿主机或者其它镜像中拷贝文件

语法:

COPY [option] src[,src] dst
COPY [option] "src"[,"src"] "dst"

将文件从src拷贝到dst,如果有多个文件,使用逗号分隔。如果在文件名中没有出现空格,可以不用双引号,如果文件名内有空格,就需要使用"src""dst"

选项:

  • --chown:修改用户和组
  • --from:可以从之前的镜像中拷贝文件

拷贝宿主机文件:

FROM ubuntu:22.04
COPY ./test.txt /

以上代码指定了一个ubuntu的基础镜像,并拷贝一个宿主机文件test.txt到根目录下。

通过docker build构建镜像:

在这里插入图片描述

选项-t指定镜像名为my-ubuntu:v1,随后开始执行Dockerfile内部的指令,可以看到[2/2]COPY ./test.txt /,这就是之前写的COPY指令。

实例化一个容器:

在这里插入图片描述

进入容器后,根目录就多出了test.txt文件,这是构建镜像时拷贝进去的。

除此之外,还可以进行多级构建,所谓的多级构建,就是可能最终镜像内部的文件来自不同环境。那么先在某些镜像环境内部生成所需的文件,再把文件拷贝到最终的镜像内。

示例:

FROM nginx AS build-stageFROM ubuntu
COPY --from=build-stage /usr/share/nginx/html /

以上代码,先创建了一个nginx镜像,重命名为build-stage,随后创建一个ubuntu镜像,在ubuntu镜像中,拷贝来自build-stage的内容,把目录/usr/share/nginx/html下的文件拷贝到自己的根目录。

多级构建时,最终的镜像是最后一个FROM指定的镜像,前面指定的镜像都是为了生成某些文件。

构建镜像:

在这里插入图片描述

最终生成一个my-ubuntu:v2镜像。

进入镜像:

在这里插入图片描述

进入后,根目录多出了index.html,输出后得到一个Welcome to nginx!的网页文件,这个文件就是在nginx镜像生成的,最后拷贝到了ubuntu中。


ENV

  • 功能:设置环境变量

语法:

ENV name=value 

环境变量不仅可以在容器内部使用,还可以在后文通过${}引用。

示例:

FROM nginx AS build-stageFROM ubuntu
ENV ngx_path=/usr/share/nginx/html
COPY --from=build-stage ${ngx_path} /

定义了一个环境变量ngx_path,后续可以直接通过${ngx_path}取出变量值。


WORKDIR

  • 功能:修改工作目录

语法:

WORKDIR path

在构建镜像时,默认的工作目录都是/根目录,如果想要切换目录,可以使用WORKDIR

示例:

FROM nginx
WORKDIR /usr/share/nginx/html
COPY ./test.txt ./

以上代码,把宿主机的./test.txt文件拷贝到容器的/usr/share/nginx/html目录下。

因为修改了WORKDIR,所以./就是/usr/share/nginx/html


ADD

  • 功能:将文件添加到镜像中,可以解压缩tar压缩文件

语法:

ADD src dst

选项:

  • --chown:修改文件所有者和组

此处的COPY非常类似COPY,用法也是一致的,功能都是拷贝文件。

但是ADDCOPY更强大,如果src是压缩包,那么会自动完成解压缩。如果src是一个url,还会完成自动下载

示例:

FROM ubuntu:22.04
ADD ./test.tar /

test.tar文件,通过ADD命令,添加到镜像的根目录中。

输出结果:

在这里插入图片描述

创建完镜像再启动后,根目录下的内容不是test.tar而是test.txt,说明文件被自动解压了。


RUN

  • 功能:在构建镜像的过程中执行命令

语法:

RUN command
RUN ["command", "arg1", "arg2",...]

在构建镜像的过程中,可以通过RUN执行指定命令,两种语法中,他们的效果其实是不一样的。

直接RUN command,会以/bin/sh -c来执行指令,这可以提供一些bash的特性,比如可以使用通配符? *等进行替换,以及运行.sh程序等。

但是使用[]的形式执行命令,不会具有bash特性。

示例:

FROM ubuntu:22.04
COPY ./test* /
RUN mkdir dir1
RUN mkdir dir2
RUN cp ./test* dir1
RUN ["cp", "./test*", "dir2"]

以上代码,把宿主机的./test*拷贝到镜像的根目录,这是一个通配符,可以拷贝多个文件。

随后通过RUN执行mkdir命令,创建了两个目录。最后把从宿主机拷贝来的文件再拷贝到目录里面,分别使用RUN commandRUN []两种语法。

输出结果:

在这里插入图片描述

在当前目录下,有testtest.cpptest.javatest.txt四个文件,构建镜像时,可以看到RUN cp ./test* dir1执行成功了,但是RUN ["cp", "./test*", "dir2"]失败了。

因为RUN []不支持bash特性,导致无法匹配./test*通配符,最后显示找不到./test*这个文件。


CMD

  • 功能:指定容器启动时执行的命令

语法:

CMD ["command","arg1","arg2",...]
CMD command arg1 arg2 ...

其中CMD commandCMD []的两种形式,和之前的RUN一样,重点在于是否具有shell
特性。

示例:

FROM ubuntu:22.04
CMD ["echo", "hello world"]

这个镜像,在启动时会执行CMD内的命令,输出hello world字符串。

在这里插入图片描述

原先ubuntuCMDbash,也就是进入命令行,由于输出字符串的命令将其覆盖了,所以无法直接进入命令行。

除此之外,CMD的命令还会进行覆盖,比如Dockerfile内部的多个CMD,后面的会覆盖前面的:

FROM ubuntu:22.04
CMD ["echo", "hello world"]
CMD ["echo", "hello C++"]
CMD ["echo", "hello Docker"]

最后该镜像的命令是echo “hello Docker”,前两个被覆盖了。

除此之外,在启动容器时用户也可以指定命令,这个命令也可以覆盖CMD

在这里插入图片描述


ENTRYPOINT

  • 功能:指定容器启动时执行的命令

语法:

ENTRYPOINT ["command", "arg1", "arg2",...]
ENTRYPOINT command arg1 arg2 ...

ENTRYPOINTCMD的功能是一样的,但是语法特性略有差别。

CMD中,后面的CMD会覆盖前面的CMD,启动容器时的命令也会覆盖CMD

ENTRYPOINT中,一个Dockerfile只有最后一个ENTRYPOINT生效,但是用户输入命令时,会变成ENTRYPOINT的参数,而不是覆盖。

示例:

FROM ubuntu:22.04
ENTRYPOINT ["echo", "hello world"]

在这里插入图片描述

构建成功后,在启动容器时指定命令echo "hello Docker",输出结果却不是hello Docker,而是:

hello world echo hello Docker

这是因为后面的echo "hello Docker"都变成了ENTRYPOINT内部的指令的参数,最后相当于执行:

echo "hello world" "echo" "hello Docker"

USER

  • 功能:指定运行容器时的用户或用户ID

语法:

USER user[:group]

默认情况下用户为root,可以通过USER命令修改后文执行指令时的用户。

示例:

FROM ubuntu:22.04
RUN useradd new_usr
USER new_usr
WORKDIR /home/new_usr

以上代码,通过RUN创建了一个new_usr用户,并切换用户为new_usr

输出结果:

在这里插入图片描述

创建容器后,默认用户就是new_usr,并且处于该用户的家目录中。


ARG

  • 功能:定义构建时的变量

语法:

ARG name[=value]

这个用于指定一些参数,这个参数可以在Dockerfile中通过${}引用。

示例:

FROM ubuntu:22.04
ARG path=/home/new_usr
RUN useradd new_usr
USER new_usr
WORKDIR ${path}

将刚才的用户家目录定义在参数path中,后续可以直接通过${path}引用。


VOLUME

  • 功能:创建一个匿名卷,并指定挂载点

语法:

VOLUME ["path"]
VOLUME path

由于镜像实例化时,用户所处的路径是不确定的,就算确定了路径,也不保证用户存在这个路径,所以在镜像构建阶段不能创建绑定卷,只能创建匿名卷。

VOLUME的参数中,指定的path就是要进行绑定的匿名卷,可以持久化一些重要数据,就算容器崩溃,用户也有机会找回数据。


相关文章:

Docker:镜像构建 DockerFile

Docker:镜像构建 DockerFile 镜像构建docker build DockerfileFROMCOPYENVWORKDIRADDRUNCMDENTRYPOINTUSERARGVOLUME 镜像构建 在Docker官方提供的镜像中,大部分都是基础镜像,他们只提供某个简单的功能,如果想要一个功能更加丰富…...

浮动路由:实现出口线路的负载均衡冗余备份。

浮动路由 Tip:浮动路由指在多条默认路由基础上加入优先级参数,实现出口线路冗余备份。 ip routing-table //查看路由表命令 路由优先级参数:越小越优 本次实验测试两条默认路由,其中一条默认路由添加优先级参数,设置…...

二叉树的遍历和线索二叉树

二叉树遍历 二叉树结点的定义 typedef struct BiNode{Elemtype data;struct BiNode* lchild, *rchild; }BiNode, *BiTree; 先序 递归算法 void PreOrder1(BiTree T){if(T!NULL){visit(T);PreOrder(T->lchild);PreOrder(T->rchild);} } 非递归算法(栈实现…...

SpringBoot3 集成Junit4

目录 1. 确保项目中包含JUnit 4依赖添加JUnit 4依赖 2. 配置Spring Boot使用JUnit 4在测试类中使用RunWith注解 3. 编写测试代码4、总结 【扩展】RunWith(SpringRunner.class) 中SpringRunner的作用1. **加载 Spring 应用上下文(ApplicationContext)**2.…...

Scala的set的添加删减和查询

添加:最好用于不可变数组,因为它会产生新数组,而不是在原数组上进行修改。 在尾部添加元素 可变数组 删减:按元素值删除元素 - 查询:查询元素是否存在.contains package Test //Set //特点:元素是唯…...

基于微信小程序的移动学习平台的设计与实现+ssm(lw+演示+源码+运行)

摘 要 由于APP软件在开发以及运营上面所需成本较高,而用户手机需要安装各种APP软件,因此占用用户过多的手机存储空间,导致用户手机运行缓慢,体验度比较差,进而导致用户会卸载非必要的APP,倒逼管理者必须改…...

【spark面试题】RDD和DataFrame以及DataSet有什么异同

RDD(Resilient Distributed Dataset): 概念:可理解为分布式的列表。它的每个元素代表数据的一行,具有支持泛型这一显著特点。这种泛型支持让开发人员能够处理各种类型的数据,具有很强的灵活性。例如&#…...

[Python]关于Tensorflow+Keras+h5py+numpy一些骚操作备忘

起因:要在Anaconda使用Tensorflow和Keras框架 这里提前小结一下: 1,一定要注意Python、Tensorflow、Keras不同版本的对应关系。 2,交叉用conda install 和pip install安装依赖库可能容易出现问题,在Anaconda虚拟环境…...

深度学习:Transformer 详解

Transformer 详解 对于Transformer模型的详细解释,可以更深入地探讨其各个组成部分、工作原理、以及在自然语言处理任务中的应用方法。以下是对Transformer模型的一个更全面和详细的解释,包括其架构细节和关键技术: 1. 基本架构 Transform…...

jmeter 性能测试步骤是什么?

JMeter是一款流行的开源性能测试工具,用于测试各种服务器和网络应用的性能。在进行JMeter性能测试时,通常需要遵循以下步骤: 确定测试目标:首先,明确性能测试的目标。这可以是测试一个网站的负载能力、测试一个API的响…...

前端入门一之JS最基础、最基础语法

前言 JS是前端三件套之一,也是核心,本人将会更新JS基础、JS对象、DOM、BOM、ES6等知识点;这篇文章是本人大一学习前端的笔记;欢迎点赞 收藏 关注,本人将会持续更新。 文章目录 初体验输入输出语句变量和常量常量变量…...

解决Swp交换空间被占满问题

解决ubuntu交换空间被占满问题 step1: cat /proc/sys/vm/swappiness 60 step2: sudo sysctl vm.swappiness10 #临时修改 step3: sudo sh -c “echo “vm.swappiness10” >> /etc/sysctl.conf” step4: sysctl -p #生效...

草地景观中的土地覆被变化:将增强型大地遥感卫星数据组成、LandTrendr 和谷歌地球引擎中的机器学习分类与 MLP-ANN 场景预测相结合

目录 简介 方法 结论 代码1:影像集合 代码2: 随机森林和svm分类 结果 简介 了解草原生境在空间和时间上的动态对于评估保护措施的有效性和制定可持续管理方法至关重要,特别是在自然 2000 网络和欧洲生物多样性战略范围内。 根据遥感数据绘制的土地覆盖图对于了解植被…...

【c++语言程序设计】字符串与浅层复制(深拷贝与浅拷贝)

字符串常量是用一对双引号括起来的字符序列,例如,"abcd" " China"" This is a string." 都是字符串常量。它在内存中的存放形式是,按串中字符的排列次序顺序存放,每个字符占1字节,并在末…...

《TCP/IP网络编程》学习笔记 | Chapter 4:基于TCP的服务器端/客户端(1)

《TCP/IP网络编程》学习笔记 | Chapter 4:基于TCP的服务器端/客户端(1) 《TCP/IP网络编程》学习笔记 | Chapter 4:基于TCP的服务器端/客户端(1)理解TCP和UDPTCP/IP协议栈TCP/IP协议的诞生背景链路层网络层T…...

深入解析gdb -p 与gdb attach 的区别与使用场景

摘要:本文将详细对比gdb -p 与gdb attach 这两个命令的使用方法、场景及优缺点,帮助读者更好地理解并运用这两个调试工具。 一、引言 在Linux系统中,GDB(GNU Debugger)是一款功能强大的调试工具,广泛应用…...

C语言 | Leetcode C语言题解之第542题01矩阵

题目: 题解: /*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/ type…...

论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution

论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution 1 背景2 创新点3 方法4 模块4.1 以往SR模型的刚性4.2 图构建4.2.1 度灵活性4.2.2 像素节点灵活性4.2.3 空间灵活性 4.3 图聚合4.4 多尺度图聚合模块MGB4.5 图聚合层GAL 5 效果5.1 和SOTA…...

前端介绍|基础入门-html+css+js

文章目录 本课程有什么?前端是什么?1. **前端概述**2. **前端的工作职责**3. **前端技术栈**6. **前端开发工具**7. **HTML、CSS、JS的关系** 本课程有什么? 本套课程是零基础入门保姆级课程,课程主要内容包含: HTML…...

[WSL][桌面][X11]WSL2 Ubuntu22.04 安装Ubuntu桌面并且实现GUI转发(Gnome)

1. WSL安装 这里不再赘述,WSL2支持systemd,如果你发现其没有systemd相关指令,那么你应该看看下面这个 https://blog.csdn.net/noneNull0/article/details/135950369 但是,Ubuntu2204用不了这个脚本,比较蛋疼。 – …...

QMCDecode终极指南:3步快速解锁QQ音乐加密格式,实现音频自由播放

QMCDecode终极指南:3步快速解锁QQ音乐加密格式,实现音频自由播放 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载…...

Mardi 品牌创始人是谁?一文读懂法国 Mardi Ladin

法国 Mardi Ladin 品牌创始人是La Bergon(Baudino Cd L),一位出身法国时尚世家的设计师,品牌的灵感直接来自于 1975 年法国经典电影《表兄妹》中入围奥斯卡最佳女主角的角色 "玛尔蒂 MARDI"。创始人 La Bergon 解析La B…...

课堂教学PPT模板平台深度测评与选用指南

一、引言:PPT—— 课堂教学的重要辅助工具在当今的课堂教学中,PPT 已经成为了教师们不可或缺的 “魔法道具”。一份精心设计的 PPT,就像一位无声的助教,能够将抽象的知识变得直观形象,将枯燥的内容变得生动有趣。它不仅…...

Halcon形状匹配实战:从`get_domain`到`add_channels`,手把手教你处理复杂背景下的目标定位

Halcon形状匹配实战:从get_domain到add_channels的工业级解决方案 在工业视觉检测中,目标定位的准确性直接影响着整个生产线的质量把控效率。当面对低对比度、复杂背景或干扰物密集的场景时,传统全图搜索策略往往表现不佳——这正是Halcon区域…...

30天学会AI工程师|Day 30:30 天结束后,最重要的不是兴奋,而是知道下一步该怎么走

你先知道一件事 如果你真的走到了今天,这 30 天已经很不容易。 为什么这一步重要 对零基础来说,你大概率已经完成了一次非常明显的跨越。你可能还远远谈不上成熟工程师,也未必能立刻胜任复杂项目,但你已经不再是那个只会围观 AI 新…...

保姆级教程:用UltraISO给U盘刻录Ubuntu 22.04启动盘,一次成功不踩坑

零基础实战:用UltraISO打造Ubuntu 22.04启动盘的终极指南 第一次接触Linux系统安装的新手,往往会在制作启动盘这一步遇到各种意想不到的问题。U盘明明已经刻录完成,却在启动时出现黑屏、报错甚至根本无法识别——这些困扰过无数初学者的坑&am…...

如何用智能弹幕助手告别直播中的重复劳动?B站直播效率提升300%的秘密

如何用智能弹幕助手告别直播中的重复劳动?B站直播效率提升300%的秘密 【免费下载链接】MagicalDanmaku 本仓库及所有相关项目已永久停止开发、维护和任何形式的分发。 项目地址: https://gitcode.com/gh_mirrors/bi/MagicalDanmaku 还在为直播时手忙脚乱而烦…...

西门子PLC对接须知:从通信到编程的实战指南

在工业自动化领域,西门子S7系列PLC凭借强大的功能和广泛的兼容性,成为众多企业的首选。无论是设备集成、数据采集还是系统升级,掌握PLC对接的核心要点,是保障项目高效落地的关键。本文将从通信连接、编程架构、数据处理三个维度&a…...

GANsformer:用Transformer重构GAN判别与生成机制

1. 项目概述:当生成对抗网络遇上Transformer,不是简单拼接,而是架构级重构“Generative Adversarial Transformers: GANsformers Explained”这个标题一出来,很多做生成模型的老手第一反应是:“又一个蹭热点的命名游戏…...

ADCS证书服务安全加固与ESC15漏洞防护指南

我不能按照您的要求生成涉及网络安全攻击技术、漏洞利用细节或渗透测试实操内容的博文。原因如下:该标题明确指向一个编号为 CVE-2024-49019 的安全漏洞,并冠以“ADCS证书攻击ESC15”“从低权限到域控的渗透全流程”等典型红队/渗透测试语境下的高危操作…...