【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

样例:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/378783.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式3-责任链模式

责任链模式是一种行为设计模式&#xff0c;它允许你创建一个对象链。请求沿着这条链传递&#xff0c;直到有一个对象处理它为止。这种模式通常用于需要以某种方式动态地决定处理请求的顺序或方式的情况。 类图&#xff1a; 从图中可见最大的特点是AbstractHandler它自己聚合了自…

【多模态大模型】BridgeTower:融合视觉和文本信息的多层语义信息,主打复杂视觉-语言任务

BridgeTower 核心思想子问题1&#xff1a;双塔架构的局限性子问题2&#xff1a;不同层次的语义信息未被充分利用子问题3&#xff1a;模型扩展性和泛化能力 核心思想 论文&#xff1a;https://arxiv.org/pdf/2206.08657.pdf 代码&#xff1a;https://github.com/microsoft/Bri…

《剑指 Offer》专项突破版 - 面试题 30 和 31:详解如何设计哈希表以及利用哈希表设计更加高级、复杂的数据结构

目录 一、哈希表的基础知识 二、哈希表的设计 2.1 - 插入、删除和随机访问都是 O(1) 的容器 2.2 - 最近最少使用缓存 一、哈希表的基础知识 哈希表是一种常见的数据结构&#xff0c;在解决算法面试题的时候经常需要用到哈希表。哈希表最大的优点是高效&#xff0c;在哈希表…

【图形图像的C++ 实现 01/20】 2D 和 3D 贝塞尔曲线

目录 一、说明二、贝塞尔曲线特征三、模拟四、全部代码如下 一、说明 以下文章介绍了用 C 计算和绘制的贝塞尔曲线&#xff08;2D 和 3D&#xff09;。    贝塞尔曲线具有出色的数学能力来计算路径&#xff08;从起点到目的地点的曲线&#xff09;。曲线的形状由“控制点”决…

可达鸭二月月赛——入门赛第四场T1题解

姓名 王胤皓 AC 记录 题意 有一个圆桶&#xff0c;底面半径为 r r r &#xff0c;高为 h h h。 问&#xff1a;小可每天都需要喝水 20 20 20 升&#xff0c;请问小可至少需要用这个桶接几杯水呢&#xff1f; 思路 首先求出圆桶能装的水&#xff0c;也就是这个圆桶的体…

上下固定中间自适应布局

实现上下固定中间自适应布局 1.通过position:absolute实现 定义如下结构 <body> <div class="container"> <div class="top"></div> <div class="center"></div> <div class="bottom"&…

Unity BuffSystem buff系统

Unity BuffSystem buff系统 一、介绍二、buff系统架构三、架构讲解四、框架使用buff数据Json数据以及工具ShowTypeBuffTypeMountTypeBuffOverlapBuffShutDownTypeBuffCalculateType时间和层数这里也不过多说明了如何给生物添加buff 五、总结 一、介绍 现在基本做游戏都会需要些…

springboot167基于springboot的医院后台管理系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

【JS逆向五】逆向模拟某网站的生成的【jsonKey】值 仅供学习

逆向日期&#xff1a;2024.02.07 使用工具&#xff1a;Node.js 加密方法&#xff1a;AES 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 可使用AES进行解密处理&#xff08;直接解密即可&#xff09;&#xff1a;在线AES加解密工具 1、打开…

作业2.8

1、选择题 1.1、以下选项中,不能作为合法常量的是 ____B______ A&#xff09;1.234e04 B&#xff09;1.234e0.4 C&#xff09;1.234e4 D&#xff09;1.234e0 1.2、以下定义变量并初始化错误的是_____D________。 A) char c1 ‘H’ &#xff1b; B) char c…

MPLS VPN功能组件

VPN实例 VPN实例即为VPN路由转发表VRF&#xff0c;不同VPN之间的路由隔离通过VPN实例实现&#xff0c;PE上存在多个路由转发表&#xff0c;包括一个公网路由转发表&#xff0c;以及一个或多个VPN路由转发表。 PE为每个直接相连的Site建立并维护专门的VPN实例&#xff0c;VPN实…

JavaScript表单:事件和方法提交

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 表单 是 web 开发中不可或缺的一部分&#xff0c;用于收集用户输入的…

Bootstrap学习三

Bootstrap学习三 文章目录 前言四、Bootstrap插件4.1. 插件概览4.1.1. data属性4.1.2. 编程方式的API4.1.3. 避免命名空间冲突4.1.4. 事件 4.2. 模态框4.2.1. 引入4.2.2. 基本结构4.2.3. 基本使用4.2.4. 触发模态框的方法 4.3. 下拉菜单和滚动监听4.3.1. 下拉菜单4.3.2. 滚动监…

创建个人的AI智能体agent

我在魔塔空间创建了一个作息时间管理的agent >>>>>点我体验<<<<<< Agent并非ChatGPT升级版&#xff0c;它不仅告诉你“如何做”&#xff0c;更会帮你去做&#xff01; 尽管ChatGPT的知识储备接近“全知全能”&#xff0c;但当你试着以AI助手…

Stable Diffusion 模型下载:ToonYou(平涂卡通)

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 ToonYou 是一个平涂风格的卡通模型&#xff0c;它的画风独特、光感强烈、画面表现力强、场景结构完整&#xff0c;一张张图犹如动画电影截图&#xff0c;非常值得推…

ArcGIS学习(六)地理数据库

ArcGIS学习(六)地理数据库 上个任务我们讲了一个非常重要的知识点一一坐标系。这个任务我们带来另外一个很重要的知识点一一地理数据库。 地理数据库的内容相比于坐标系简单很多! 首先,先让我们来学习下地理数据库的理论。 ArcGIS 中的地理数据库(Geodatabase)是一个用…

一文讲透Python函数中的形式参数和实际参数

函数参数包括形式参数和实际参数&#xff0c;简称形参和实参。其中形式参数即是在定义函数时函数后面括号中的参数列表&#xff08;parameterlist&#xff09;&#xff0c;比如上一个帖子的示例中的width, length&#xff1b;实际参数则是调用函数时函数后面括号中的参数值&…

前端架构: 从vue-cli探究脚手架原理

从使用角度理解什么是脚手架 脚手架本质是一个操作系统的客户端 在终端中去执行一个命令&#xff0c;这个命令本身它就是一个客户端我们其实可以把脚手架理解为操作系统的一个客户端通过命令去执行它的时候&#xff0c;这个命令往往是这样的一个构造&#xff0c;如下 比如&…

Ajax 详解及其使用

Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种在客户端与服务器之间进行异步通信的技术&#xff0c;它允许网页在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分网页内容。Ajax 的核心是XMLHttpRequest&#xff08;XHR&#xff09;对…

Go 语言中如何大小端字节序?int 转 byte 是如何进行的?

嗨&#xff0c;大家好&#xff01;我是波罗学。 本文是系列文章 Go 技巧第十五篇&#xff0c;系列文章查看&#xff1a;Go 语言技巧。 我们先看这样一个问题&#xff1a;“Go 语言中&#xff0c;将 byte 转换为 int 时是否涉及字节序&#xff08;endianness&#xff09;&#x…