【Docker进阶】镜像制作-用Dockerfile制作镜像(一)
进阶一 · docker镜像制作
文章目录
- 进阶一 · docker镜像制作
- 用`dockerfile`制作镜像
- dockerfile是什么
- dockerfile格式
- 为什么需要dockerfile
- Dockerfile指令集合
- FROM
- MAINTAINER
- LABEL
- COPY
- ENV
- WORKDIR
用dockerfile
制作镜像
用快照制作镜像的缺陷:
- 黑盒
- 不可重复
- 臃肿
dockerfile是什么
镜像的定制实际上就是定制每一层所要添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,这个脚本就是dockerfile
。
Dockerfile是一个文本文件,其包含了一条条的指令(instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
dockerfile格式
如果行开头是#
,那么这一行表示注释,如果#
出现在其他地方,这个#
都被视为参数。
指令一般写成大写(虽然大小写都可以),但是为了和参数作区分,我们一般就用大写。
简单dockerfile例子:
FROM ubuntu:20.04
ADD run.sh /
CMD ["/run.sh"]
为什么需要dockerfile
- 可以按照需求自定义镜像
- 和docker commit一样能够自定义镜像,官方的镜像可以说很少能直接满足我们应用的,都需要我们自己打包自己的代码然后做成对应的应用镜像对外使用。
- 很方便的自动化构建,重复执行
- 通过dockerfile可以自动化的完成镜像的构建,而不是像docker commit一样,手动一个命令一个命令执行,而且可以重复执行,docker commit都话很容易忘记执行了哪个命令,哪个命令没有执行
- 维护修改方便,不再是黑箱操作
- 使用docker commit意味着对所有镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,dockerfile很容易二次开发
- 更加标准化,体积可以做的更小
- docker容器启动之后,系统运行会生成很多运行时的文件,如果使用docker commit
Dockerfile指令集合
指令的官方文档:https://docs.docker.com/engine/reference/builder/
指令 | 功能 |
---|---|
FROM | 构建镜像是基于哪个镜像,也就是基础镜像 |
MAINTAINER | 镜像维护者的姓名或者邮箱地址(已经废弃,被label替代了) |
LABEL | 为镜像添加元数据 |
COPY | 拷贝文件或者目录到镜像中,跟ADD类似,但不具备自动下载或者解压的功能 |
ADD | 拷贝文件或目录到镜像中,如果是URL或者压缩包便会自动下载或自动解压 |
WORKER | 指定工作目录 |
RUN | 指定docker build过程中运行的程序 |
VOLUME | 指定容器挂载点 |
EXPOSE | 声明容器的服务端口(仅仅是声明) |
ENV | 设置环境变量 |
CMD | 运行容器时执行的命令 |
ENTRYPOINT | 运行容器时程序入口 |
ARG | 指定构建时的参数 |
SHELL | 指定采用哪个shell(使用较少) |
USER | 指定当前用户 |
HEALTHCHECK | 健康检测指令 |
ONBUILD | 在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行(使用较少) |
STOPSIGNAL | 允许您覆盖发送到容器的默认信号(使用较少) |
FROM
FROM 指令用于为镜像文件构建过程指定基础镜像,后续的指令运行于此基础镜像所提供的运行环境。
注意事项:
-
FROM 指令必须是 Dockerfile 中非注释行或者 ARG 之后的第一个指令。
-
实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build 会在docker 主机上查找指定的镜像文件,在其不存在时,则会自动从 Docker 的公共库 pull 镜像下来。如果找不到指定的镜像文件,docker build 会返回一个错误信息。
-
FROM 可以在一个 Dockerfile 中出现多次,如果有需求在一个 Dockerfile 中创建多个镜像,或将一个构建阶段作为另一个的依赖。
-
如果 FROM 语句没有指定镜像标签,则默认使用 latest 标签。
语法:
FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
参数:
<platform>
:构建的cpu架构,如 linux/amd64, linux/arm64, windows/amd64<image>
:指定作为 base image 的名称<tag>
:base image 的标签,省略时默认 latest)<digest>
:是镜像的哈希码AS <name>
:指定构建步骤的名称,配合COPY --from=<name>
可以完成多
MAINTAINER
功能:
- 用于让dockerfile制作者提供本人的详细信息
- 该功能已经废弃,由label替代
语法:
MAINTAINER <author's detail>
样例:
MAINTAINER "yufc <yufc@xx.com>"
使用例子:
LABEL
功能:
为镜像添加元数据,元数据是kv对的形式。
语法:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
样例:
COPY
功能:
- 用于从docker主机赋值新文件或者目录至创建的新镜像的指定路径中。
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
参数:
<src>
:要复制的源文件或目录,支持使用通配符<dest>
:目标路径,即正在创建的image的文件系统路径,建议<dest>
使用绝对路径,否则,COPY指定以WORKDIR为当前路径
在路径中有空白字符时,通常使用第二种格式。
--chown
:修改用户和组--from<name>
:可选项。可以从之前构建的步骤中拷贝内容,结合FROM ... AS <name>
往往用作多级构建,后续我们有实战课专门完成多级构建
注意事项:
<src>
必须是build上下文中的路径,不能是其父目录中的文件。- 如果
<src>
是目录,则其内部文件或子目录会被递归复制,但<src>
目录自身不会被复制。 - 如果指定了多个
<src>
,或在<src>
中使用了通配符,则<dest>
必须是一个目录,且必须以’/'结尾。 - 如果
<dest>
事先不存在,它将会被自动创建,这包括父目录路径。
例子一:
例子二:
发现镜像里面已经有一个叫news的用户和一个叫news的组。
ENV
功能:
- 用于为镜像定义所需的环境变量,并可以被Dockerfile文件中位于其后的其他指令(如ENV,ADD,COPY等)所调用
- 调用格式为
$variable_name
或${variable_name}
语法:
ENV <key>=<value>
案例:
WORKDIR
功能:
- 为Dockerfile中所有的RUN,CMD,ENTRYPOINT,COPY和ADD设定工作目录
语法:
WORKDIR /path/to/workdir
注意事项:
- 默认的工作目录是
/
。 - 如果提供了相对路径,它将相对于前一条
WORKDIR
指令的路径 WORKDIR
指令可以解析先前使用设置的环境变量ENV
样例:
相关文章:

【Docker进阶】镜像制作-用Dockerfile制作镜像(一)
进阶一 docker镜像制作 文章目录 进阶一 docker镜像制作用dockerfile制作镜像dockerfile是什么dockerfile格式为什么需要dockerfileDockerfile指令集合FROMMAINTAINERLABELCOPYENVWORKDIR 用dockerfile制作镜像 用快照制作镜像的缺陷: 黑盒不可重复臃肿 docker…...

数据密集型应用系统设计
数据密集型应用系统设计 原文完整版PDF:https://pan.quark.cn/s/d5a34151fee9 这本书的作者是少有的从工业界干到学术界的牛人,知识面广得惊人,也善于举一反三,知识之间互相关联,比如有个地方把读路径比作programming …...

分布式文件系统 SpringBoot+FastDFS+Vue.js【一】
分布式文件系统 SpringBootFastDFSVue.js【一】 一、分布式文件系统1.1.文件系统1.2.什么是分布式文件系统1.3.分布式文件系统的出现1.3.主流的分布式文件系统1.4.分布式文件服务提供商1.4.1.阿里OSS1.4.2.七牛云存储1.4.3.百度云存储 二、fastDFS2.1.fastDSF介绍2.2.为什么要使…...

【PyQt】11-QTextEdit、QPushButton
文章目录 前言一、文本输入-QTextEdit1.1 代码1.2 运行结果 二、QPushButton2.1.1 按钮上添加文本2.1.2 按键的弹跳效果2.1.3 两个信号可以绑定一个槽。2.1.4 带图标的按键运行结果 2.1.5 按键不可用以及回车默认完整代码2.2 单选按键控件运行结果 2.3 复选框(多选框…...

初识webpack(二)解析resolve、插件plugins、dev-server
目录 (一)webpack的解析(resolve) 1.resovle.alias 2.resolve.extensions 3.resolve.mainFiles (二) plugin插件 1.CleanWebpackPlugin 2.HtmlWebpackPlugin 3.DefinePlugin (三)webpack-dev-server 1.开启本地服务器 2.HMR模块热替换 3.devServer的更多配置项 (…...

什么是自编码器Auto-Encoder?
来源:https://www.bilibili.com/video/BV1Vx411j78H/?spm_id_from333.1007.0.0&vd_sourcef66cebc7ed6819c67fca9b4fa3785d39 为什么要压缩呢? 让神经网络直接从上千万个神经元中学习是一件很吃力的事情,因此通过压缩提取出原图片中最具代…...

openGauss学习笔记-219 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-网络
文章目录 openGauss学习笔记-219 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-网络219.1 查看网络状况 openGauss学习笔记-219 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-网络 获取openGauss节点的CPU、内存、I/O和网络资源使用情况,确认这些资源…...

SAP PP学习笔记- 豆知识01 - 怎么查询既存品目
SAP系统当中已经有哪些品目要怎么查询呢? 1,MM60 品目一览 这里可以输入Plant,然后可以查询该工厂的所有品目。 2,SE16 > MARA MARA 品目一般Data,存放的是品目基本信息。 如果要查询该品目属于哪个Plant&#x…...
相机的机身马达有什么用?
新手疑问: 为什么我的尼康D3200相机明明拥有拍视频能力,但是拍摄视频时却不能对焦 科普时间 那是因为你的相机缺少机身马达,并且你所使用的镜头也没有马达!机身马达是用于给镜头提供对焦动力的装置。它的作用是使相机具备自动对焦功能。如…...

拿捏c语言指针(上)
目录 前言 编辑 指针 内存与地址 计算机常见单位 理解编址 取地址,指针变量,解引用 取地址 指针变量 解引用 指针变量大小 指针类型的作用 char*解引用后 指针-整数 应用 void*指针 const修饰指针变量 const修饰普通变量 const修饰指…...
JVM指令手册
栈和局部变量操作将常量压入栈的指令 aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入操作数栈 iconst_2 将int类型常量2压入栈 iconst_3 将int类型常量3压入栈 iconst_4 将int类型常量4…...

Linux之多线程
目录 一、进程与线程 1.1 进程的概念 1.2 线程的概念 1.3 线程的优点 1.4 线程的缺点 1.5 线程异常 1.6 线程用途 二、线程控制 2.1 POSIX线程库 2.2 创建一个新的线程 2.3 线程ID及进程地址空间布局 2.4 线程终止 2.5 线程等待 2.6 线程分离 一、进程与线程 在…...
TestNG invocationCount属性
有时我们会遇到这样的问题,比如如何多次运行一个测试用例?invocationCount是这个问题的答案。在这篇文章中,我们将讨论在TestNG中与Test annotation一起使用的invocationCount属性。 这个属性有什么作用,或者调用计数有什么用&am…...
关于maven项目中无法通过邮件服务器发送邮件的补充解决方案
1、问题及解决方法 我的一篇文章中提到使用代码发送电子邮件,但是maven项目中无法执行成功,现在我找到了解决办法,只要引入依赖时同时引入下面两个依赖就行了,我无法找到原因主要是使用单元测试方法运行,它居然不报错&…...

树形dp 笔记
树的最长路径 给定一棵树,树中包含 n 个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值。 现在请你找到树中的一条最长路径。 换句话说,要找到一条路径,使得使得路径两端的点的距离最远。 注意&…...

2024-02-08 Unity 编辑器开发之编辑器拓展1 —— 自定义菜单栏
文章目录 1 特殊文件夹 Editor2 在 Unity 菜单栏中添加自定义页签3 在 Hierarchy 窗口中添加自定义页签4 在 Project 窗口中添加自定义页签5 在菜单栏的 Component 菜单添加脚本6 在 Inspector 为脚本右键添加菜单7 加入快捷键8 小结 1 特殊文件夹 Editor Editor 文件夹是 …...

typescript中的Omit排除类型及Pick取想要的属性
Omit 的使用:排除类型 type OmitUser {name: string,age: number,sex:string } type newOmit Omit<OmitUser, sex>// 定义一个对象并将其类型设置为 newOmit const example: newOmit {name: "John",age: 30 };console.log( Omit 的使用:排除类型 , example…...

MATLAB计算极限和微积分
一.函数与极限 计算极限:lim(3*x^2/(2x1)),x分别趋于0和1,代码如下: syms x; limit(3*x*x/(2*x1),x,0) limit(3*x*x/(2*x1),x,1) 结果分别为0和1: 1.计算双侧极限 计算极限:lim(3*x^2/(2x1))࿰…...
在数组中插入元素
问题:假设有一个数组{1,2,3,4,5},如果我们要在3之后插入一个数(520),这该怎么办呢? 思路:要想在以元素3之后插入一个元素,我们先要做…...

【计算机网络】物理层|传输介质|物理层设备|宽带接入技术
目录 一、思维导图 二、传输介质 1.传输介质——导引型 2.传输介质——非导引型编辑 三、物理层设备 1.物理层设备:中继器&集线器 2.宽带接入技术(有线) 编辑 四、趁热打铁☞习题训练 五、物理层总思维导图 推荐 前些天发现…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...