Dockerfile 指令的最佳实践

news2024/11/25 21:18:20

这些建议旨在帮助您创建一个高效且可维护的Dockerfile。

一、FROM

尽可能使用当前的官方镜像作为镜像的基础。Docker推荐Alpine镜像,因为它受到严格控制,体积小(目前不到6 MB),同时仍然是一个完整的Linux发行版。


FROM [--platform=<platform>] <image> [AS <name>]

or

FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]

or

FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]

FROM指令初始化新的构建阶段,并为后续指令设置基本镜像。因此,有效的Dockerfile必须以FROM指令开头。

镜像可以是任何有效的镜像——从公共存储库中提取镜像尤其容易:

  • ARG是Dockerfile中FROM之前的唯一指令
  • FROM可以在单个Dockerfile中多次出现,以创建多个镜像,或者将一个构建阶段用作另一个的依赖项。只需在每条新的FROM指令之前记下提交输出的最后一个镜像ID即可。每个FROM指令都会清除先前指令创建的任何状态。
  • 可选地,可以通过将AS名称添加到FROM指令来为新的构建阶段指定名称。该名称可以在随后的FROM和COPY-FROM=<name>指令中使用,以引用在此阶段构建的镜像。
  • 标记值或摘要值是可选的。如果省略其中任何一个,则默认情况下构建器将采用最新的标记。如果生成器找不到标记值,则返回一个错误。

可选的--platform标志可用于在FROM引用多平台映像的情况下指定镜像的平台。例如,linux/amd64、linux/arm64或windows/amd64。默认情况下,将使用构建请求的目标平台。全局构建参数可以用于此标志的值,例如,自动平台ARG允许您将阶段强制到本机构建平台(--platform=$BUILDPORM),并使用它交叉编译到阶段内的目标平台。 

二、LABEL

您可以在镜像中添加标签,以帮助按项目组织镜像、记录许可信息、帮助实现自动化或出于其他原因。对于每个标签,添加一行,以label开头,包含一个或多个键值对。以下示例显示了不同的可接受格式。解释性意见包括在内。
带空格的字符串必须加引号或转义空格。还必须转义内部引号字符(“)。例如: 

# Set one or more individual labels
LABEL com.example.version="0.0.1-beta"
LABEL vendor1="ACME Incorporated"
LABEL vendor2=ZENITH\ Incorporated
LABEL com.example.release-date="2015-02-12"
LABEL com.example.version.is-production=""

一个镜像可以有多个标签。在Docker 1.10之前,建议将所有标签合并为一个LABEL指令,以防止创建额外的层。这不再是必要的,但仍然支持组合标签。例如:

# Set multiple labels on one line
LABEL com.example.version="0.0.1-beta" com.example.release-date="2015-02-12"

上面的例子也可以写成:

# Set multiple labels at once, using line-continuation characters to break long lines
LABEL vendor=ACME\ Incorporated \
      com.example.is-beta= \
      com.example.is-production="" \
      com.example.version="0.0.1-beta" \
      com.example.release-date="2015-02-12"

三、RUN

将长的或复杂的RUN语句拆分到多行,用反斜杠分隔,使Dockerfile更具可读性、可理解性和可维护性。

1、apt-get

RUN最常见的用例可能是apt-get的应用程序。因为它安装了软件包,RUN-apt-get命令有几个反直觉的行为需要注意。
总是在同一个RUN语句中结合RUN apt-get-update和apt-get-install。例如:

RUN apt-get update && apt-get install -y \
    package-bar \
    package-baz \
    package-foo  \
    && rm -rf /var/lib/apt/lists/*

在RUN语句中单独使用apt-get-update会导致缓存问题和随后的apt-get-install指令失败。例如,此问题将出现在以下Dockerfile中:

# syntax=docker/dockerfile:1

FROM ubuntu:22.04
RUN apt-get update
RUN apt-get install -y curl

构建镜像后,所有层都在Docker缓存中。假设您稍后通过添加一个额外的包来修改apt-get-install,如以下Dockerfile所示:

# syntax=docker/dockerfile:1

FROM ubuntu:22.04
RUN apt-get update
RUN apt-get install -y curl nginx

Docker认为初始指令和修改后的指令是相同的,并重用前面步骤中的缓存。因此,由于构建使用了缓存版本,所以不会执行apt-get更新。因为apt-get更新没有运行,所以您的构建可能会得到curl和nginx包的过时版本。
使用RUN apt-get-update&&apt-get-install-y确保您的Dockerfile安装最新的软件包版本,无需进一步编码或手动干预。这种技术被称为缓存破坏。您还可以通过指定包版本来实现缓存破坏。这就是所谓的版本固定。例如:

RUN apt-get update && apt-get install -y \
    package-bar \
    package-baz \
    package-foo=1.3.*

版本固定强制构建检索特定版本,而不管缓存中有什么。这种技术还可以减少由于所需软件包中的意外变化而导致的故障。
下面是一个格式良好的RUN说明,演示了所有的apt-get建议。

RUN apt-get update && apt-get install -y \
    aufs-tools \
    automake \
    build-essential \
    curl \
    dpkg-sig \
    libcap-dev \
    libsqlite3-dev \
    mercurial \
    reprepro \
    ruby1.9.1 \
    ruby1.9.1-dev \
    s3cmd=1.1.* \
 && rm -rf /var/lib/apt/lists/*

s3cmd参数指定版本1.1.*。如果映像以前使用的是旧版本,则指定新版本会导致apt-get-update的缓存中断,并确保安装新版本。在每行列出包也可以防止包重复中的错误。
此外,当您通过删除/var/lib/apt/lists来清理apt缓存时,它会减小镜像大小,因为apt缓存不是存储在层中的。由于RUN语句以apt-get-update开始,因此总是在安装apt-get之前刷新包缓存。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【FPGA】Quartus18.1打包封装网表文件(.qxp)详细教程

当我们在做项目的过程中&#xff0c;编写的底层Verilog代码不想交给甲方时怎么办呢&#xff1f;此时可以将源代码打包封装成网表文件&#xff08;.qxp&#xff09;进行加密&#xff0c;并且在工程中进行调用。 Quartus II的.qxp文件为QuartusII Exported Partition&#xff0c;…

马来西亚虾皮选品工具:如何优化您的电商业务

随着电子商务的快速发展&#xff0c;越来越多的商家开始将目光投向在线市场。在马来西亚&#xff0c;虾皮&#xff08;Shopee&#xff09;平台成为了一个备受瞩目的电商平台&#xff0c;吸引了大量的商家和消费者。然而&#xff0c;要在这个竞争激烈的市场中脱颖而出并取得成功…

基于JavaSE+JDBC使用控制台操作的简易购物系统【源码+数据库】

1、项目简介 本项目是一套基于JavaSEJDBC使用控制台操作的简易购物系统&#xff0c;主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目可以直接作为bishe使用。 项目都经过严格调试&…

计算n的阶乘-递归与迭代之间的相爱相杀

n的阶乘是指从1连乘到n的结果&#xff0c;通常用符号n!表示。例如&#xff0c;3的阶乘表示为3!&#xff0c;计算过程如下&#xff1a; 3! 3 2 1 6 一般地&#xff0c;n的阶乘可以用递归或迭代的方式计算&#xff0c;公式为&#xff1a; n! n (n-1) (n-2) ... 2 1 …

UEM 在企业 IT 管理数字化转型有什么帮助

近年大多数公司都在努力实现数字化转型&#xff0c;业务应用程序正在迁移到云端&#xff0c;日常 IT 运营正变得更加面向移动化&#xff0c;高管们使用各种设备。员工不仅使用公司提供的台式机&#xff0c;还经常使用公司拥有的、个人启用的&#xff08;COPE&#xff09;笔记本…

浅析AI智能视频监控技术在城市交通中的作用及意义

城市交通作为整个城市的整体脉络&#xff0c;每天都发挥着重要作用&#xff0c;为了最大程度地避免城市交通堵塞、提高城市交通效率&#xff0c;智能视频监控系统发挥了重要作用。具体表现在以下几个方面&#xff1a; 1、交通违规监管&#xff1a;TSINGSEE青犀智能视频监控系统…

LeetCode刷题--- 计算布尔二叉树的值

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏&#xff1a;http://t.csdnimg.cn/ZxuNL http://t.csdnimg.cn/c9twt 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#xff0c;所以下面题目主要也是这些算法做的 我讲述…

反钓鱼防盗号,共筑校园安全防线!Coremail出席CERNET学术年会

11月27日-30日&#xff0c;中国教育和科研计算机网CERNET第二十八/二十九届学术年会在福州隆重举办&#xff0c;Coremail受邀出席&#xff0c;就高校数字化及网络安全等相关话题与高校老师、行业专家进行广泛交流。 △11月27-30日&#xff0c;Coremail在会场设展&#xff0c;为…

Vue实现注册页面的用户交互

&#x1f4d1;前言 本文主要是【Vue】——Vue实现注册页面的用户交互的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每…

CRM客户管理系统,不止管理客户。

CRM系统现在已经成为企业与客户建立良好关系、提高销售业绩的优先选择。关于CRM的功能&#xff0c;不同的企业包括CRM软件厂商都对CRM系统有不同的定义。基于此&#xff0c;我们来聊聊CRM客户管理系统除了管客户还有什么功能&#xff1f; 1、客户管理 有些企业管理客户的方式…

【互斥锁不当使用导致的条件竞争】2021_DiceCTF_hashbrown

前言 这个题目还挺有意思的&#xff0c;他并不像之前做的题目直接给你一个贴脸的 UAF 等&#xff0c;而是把 UAF 放在了条件竞争的环境下&#xff0c;其实条件竞争这个漏洞在内核中经常出现。 这里题目没有去符号&#xff0c;所以逆向的难度不是很大&#xff0c;但作者似乎在…

【Axure教程】树筛选中继器表格

树和表格是信息系统中两个重要的元件&#xff0c;树结构是一种层次化的数据结构&#xff0c;它以树的形式展示数据的层次关系&#xff1b;表格是一种二维结构&#xff0c;由行和列组成。每一行表示一个记录&#xff0c;每一列表示一个属性。在实际应用中&#xff0c;这两种结构…

陈睿接手一年后,B站全力一搏的游戏业务怎样了

11月末&#xff0c;哔哩哔哩公布了截至2023年9月30日的第三季度财报。 就在去年的这个时候&#xff0c;陈睿宣布亲自接手了B站的游戏业务。因为做游戏比给游戏打广告利润高&#xff0c;因为自研游戏利润更高&#xff0c;更因为年年亏损的B站需要这么高利润的业务来拯救。 但一…

Python文件操作(txt + xls + json)

文章目录 简介1、使用with_open读取和保存&#xff1a;.txt .bin&#xff08;二进制文本&#xff09;1.1、with open语句详解1.1、项目实战 2、使用pandas读取和保存&#xff1a;.xls .xlsx2.1、pandas简介2.2、环境配置2.3、项目实战 3、 使用json.dump读取和保存&#xff1…

MS8091/2运算放大器可Pin to Pin兼容AD8091/2

MS809x 系列是一种易用的、低成本的轨到轨输出电压反馈放大器&#xff0c;它具有典型的电流反馈放大器带宽和转换率的优势&#xff0c;同时也有较大的共模电压输入范围和输出摆幅&#xff0c;这使它很容易在单电源 2.5V 的低压情况下工作。可Pin to Pin兼容AD8091/AD8092。 虽然…

速达软件任意文件上传漏洞复现

简介 速达软件专注中小企业管理软件,产品涵盖进销存软件,财务软件,ERP软件,CRM系统,项目管理软件,OA系统,仓库管理软件等,是中小企业管理市场的佼佼者,提供产品、技术、服务等信息,百万企业共同选择。速达软件全系产品存在任意文件上传漏洞,未经身份认证得攻击者可以通过此漏…

Android渲染-AHardwareBuffer

本文主要从应用的角度介绍android的native层AHardwareBuffer创建纹理以及保存渲染数据。 HardwareBuffer 要介绍native层的AHardwareBuffer&#xff0c;就需要先从Java层的HardwareBuffer说起。Android官方对于HardwareBuffer介绍如下&#xff1a; HardwareBuffer wraps a na…

中国科技巨头:集体变革中 /华为鸿蒙 4:功能、模型、生态三大升级 |魔法半周报

我有魔法✨为你劈开信息大海❗ 高效获取AIGC的热门事件&#x1f525;&#xff0c;更新AIGC的最新动态&#xff0c;生成相应的魔法简报&#xff0c;节省阅读时间&#x1f47b; &#x1f525;资讯预览 中国科技巨头&#xff1a;集体变革中 华为鸿蒙 4&#xff1a;功能、模型、生…

宁夏一男子吸烟“逼”慢高铁 拘留7天 AI技术如何提升公共安全

最近&#xff0c;宁夏的一位男子杨某在高铁卫生间吸烟&#xff0c;触发了列车的烟雾报警系统&#xff0c;导致列车降速运行&#xff0c;最终被拘留7天。这个事件凸显了公共安全的重要性&#xff0c;特别是在交通工具上的安全管理。如果我们能够及时发现并阻止这种行为&#xff…

0011Java程序设计-ssm药店管理系统微信小程序

文章目录 摘 要目 录系统实现5.2服务端开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机…