掌握 Dockerfile:格式、解析器指令、环境变量替换
Docker 是一个开源平台,旨在自动化应用程序的构建、交付和运行。通过 Dockerfile,您可以定义镜像的构建过程。Dockerfile 是由一系列指令组成的文件,Docker 根据这些指令构建镜像。本文将介绍常用的 Dockerfile 指令、格式、解析器指令以及环境变量替换的用法,帮助开发者编写高效、规范的 Dockerfile。
Dockerfile 常用指令
指令 | 描述 |
---|---|
ADD | 添加本地或远程文件和目录。 |
ARG | 使用构建时变量。 |
CMD | 指定默认命令。 |
COPY | 复制文件和目录。 |
ENTRYPOINT | 指定默认可执行文件。 |
ENV | 设置环境变量。 |
EXPOSE | 描述您的应用程序正在监听的端口。 |
FROM | 从基础镜像创建新的构建阶段。 |
HEALTHCHECK | 启动时检查容器的健康状况。 |
LABEL | 向镜像添加元数据。 |
MAINTAINER | 指定镜像的作者。 |
ONBUILD | 指定在构建中使用镜像时的说明。 |
RUN | 执行构建命令。 |
SHELL | 设置镜像的默认 shell。 |
STOPSIGNAL | 指定退出容器的系统调用信号。 |
USER | 设置用户和组 ID。 |
VOLUME | 创建卷挂载。 |
WORKDIR | 更改工作目录。 |
Dockerfile 格式
Dockerfile 的基本格式如下:
INSTRUCTION arguments
-
指令区分大小写,通常使用大写字母表示。
-
指令按顺序执行。
-
Dockerfile 必须以
FROM
指令开头。 -
注释:以
#
开头的行是注释,BuildKit 会忽略这些行,除非它们是有效的解析器指令。-
行中的任何其他位置的
#
标记都被视为参数。这允许使用诸如以下语句RUN echo 'we are running some # of cool things'
-
注释行在执行 Dockerfile 指令之前被删除。以下示例中的注释在 shell 执行
echo
命令之前被删除。RUN echo hello \ # comment world
以下示例是等效的。
RUN echo hello \ world
-
注释不支持行延续字符。
-
-
空白符:指令参数中的空格不会被忽略。
指令参数中的空格不会被忽略。以下示例按指定的空格打印
hello world
RUN echo "\hello\world"
解析器指令
解析器指令是影响 Dockerfile 处理方式的可选指令,它们以特殊注释格式# directive=value
编写,并不会添加构建层,也不会显示为构建步骤。
规则
-
解析器指令必须位于 Dockerfile 的顶部。
-
解析器指令不支持行延续字符。
-
解析器指令不区分大小写,且通常采用小写。
支持的指令
-
# syntax=docker/dockerfile:1
:指定 Dockerfile 的语法版本。-
如果未指定,BuildKit 使用捆绑的 Dockerfile 前端版本。
-
设置将使 BuildKit 在构建之前拉取最新的稳定版本的 Dockerfile 语法。
# syntax=docker/dockerfile:1
-
-
# escape=
:设置转义字符,允许跨行书写指令。-
如果未指定,则默认转义字符为
\
。 -
将转义字符设置为
\
在Windows
上特别有用,因为\
是目录路径分隔符。\
与 Windows PowerShell一致。# escape=`FROM microsoft/nanoserver COPY testfile.txt c:\ RUN dir c:\
-
无效示例
由于这些规则,以下示例都是无效的:
-
由于行延续而无效
# direc \ tive=value
-
由于出现两次而无效
# directive=value1 # directive=value2FROM ImageName
-
被视为注释,因为它出现在构建器指令之后
FROM ImageName # directive=value
-
被视为注释,因为它出现在不是解析器指令的注释之后
# About my dockerfile # directive=value FROM ImageName
-
以下
unknowndirective
被视为注释,因为它不被识别。已知的syntax
指令被视为注释,因为它出现在不是解析器指令的注释之后。# unknowndirective=value # syntax=value
解析器指令允许使用非换行符空格。因此,以下行都被视为相同
#directive=value
# directive =value
# directive= value
# directive = value
# dIrEcTiVe=value
环境变量替换
Dockerfile 中的环境变量通过ENV
指令进行定义,可以在多个指令中作为变量进行替换。环境变量在 Dockerfile 中通常使用$variable_name
或${variable_name}
的形式进行引用,它们是等效的。大括号语法(${}
)一般用于处理没有空格的变量名问题,例如${foo}_bar
。
变量替换语法
-
$variable_name
和${variable_name}
都可以表示环境变量。 -
${variable_name}
语法支持一些标准的bash
修饰符,例如:-
${variable:-word}
:如果设置了variable
,则结果为该值;如果未设置variable
,则结果为word
。 -
${variable:+word}
:如果设置了variable
,则结果为word
;否则结果为空字符串。
-
转义环境变量
如果需要在 Dockerfile 中转义整个变量名,可以在变量名前添加\
。例如:
-
\$foo
或\${foo}
分别表示$foo
和${foo}
文字。
示例(解析后的表示形式显示在#
之后)
FROM busybox
ENV FOO=/bar
WORKDIR ${FOO} # WORKDIR /bar
ADD . $FOO # ADD . /bar
COPY \$FOO /quux # COPY $FOO /quux
支持环境变量的指令
以下是支持环境变量替换的 Dockerfile 指令列表:
-
ADD
-
COPY
-
ENV
-
EXPOSE
-
FROM
-
LABEL
-
STOPSIGNAL
-
USER
-
VOLUME
-
WORKDIR
-
ONBUILD
(与上述支持的指令之一组合时)
RUN
、CMD
和ENTRYPOINT
中的环境变量
您还可以将环境变量与RUN
、CMD
和ENTRYPOINT
指令一起使用。但在这些指令中,变量替换是由命令 shell 处理的,而不是由构建器处理的。
环境变量的作用范围
在 Dockerfile 中,环境变量的替换在整个指令中使用相同的值。修改环境变量的值仅对后续的指令生效。
ENV abc=hello
ENV abc=bye def=$abc
ENV ghi=$abc
在这个例子中:
-
def
的值变为hello
。 -
ghi
的值变为bye
。
总结
Dockerfile 是构建 Docker 镜像的核心工具,理解和掌握常用指令及解析器指令的使用,能够帮助您高效地构建镜像并简化 DevOps 流程。通过合理设置环境变量和优化构建过程,您可以提升应用程序的可移植性和可维护性。
相关文章:
掌握 Dockerfile:格式、解析器指令、环境变量替换
Docker 是一个开源平台,旨在自动化应用程序的构建、交付和运行。通过 Dockerfile,您可以定义镜像的构建过程。Dockerfile 是由一系列指令组成的文件,Docker 根据这些指令构建镜像。本文将介绍常用的 Dockerfile 指令、格式、解析器指令以及环…...
AWS Glue基础知识
AWS Glue 是一项完全托管的 ETL(提取、转换、加载)服务,与考试相关,尤其是在数据集成、处理和分析方面。 1.数据集成和 ETL(提取、转换、加载) AWS Glue 主要用于构建 ETL 管道以准备数据以进行分析。作为…...
单片机-LED实验
1、51工程模版 #include "reg52.h" void main(){ while(1){ } } 2、LED灯亮 #include "reg52.h" sbit LED1P2^0; void main(){ while(1){ LED10; } } 3、LED闪烁 #include "reg52.h" sbit LED1P2^0; //P2大…...
使用Python实现健康跟踪应用:打造智能健康管理助手
随着人们对健康的关注日益增强,智能健康管理逐渐成为热门趋势。通过持续跟踪身体状况、饮食、运动和睡眠等方面的数据,我们可以更好地了解自己的健康状态,并采取相应的措施来保持身体健康。Python,作为一种简洁且功能强大的编程语言,非常适合用来开发健康跟踪应用。本文将…...
结构型模式6.享元模式
结构型模式 适配器模式(Adapter Pattern)桥接模式(Bridge Pattern)组合模式(Composite Pattern)装饰器模式(Decorator Pattern)外观模式(Facade Pattern)享元…...
AWS S3文件存储工具类
pom依赖 <!--aws-s3--> <dependency><groupId>com.amazonaws</groupId><artifactId>aws-java-sdk-s3</artifactId><version>1.12.95</version></dependency>S3Utils import cn.hutool.core.util.ZipUtil; import com.a…...
MacDriver 项目推荐
MacDriver 项目推荐 macdriver Native Mac APIs for Go. Soon to be renamed DarwinKit! 项目地址: https://gitcode.com/gh_mirrors/ma/macdriver 1. 项目基础介绍和主要编程语言 MacDriver 是一个开源项目,旨在为 Go 语言提供原生的 macOS API 支持。该项…...
笔记:一次mysql主从复制延迟高的处理尝试
背景 mysql 5.7 主从复制 主库进行了一次灌数,导致多个大事务产生,主从延迟下不去,经确认该表最终truncate,并且该表仅有insert和select操作,故对该表的事务进行跳过,直到同步至truncate 跳过事务需谨慎&…...
《Vue3实战教程》40:Vue3安全
如果您有疑问,请观看视频教程《Vue3实战教程》 安全 报告漏洞 当一个漏洞被上报时,它会立刻成为我们最关心的问题,会有全职的贡献者暂时搁置其他所有任务来解决这个问题。如需报告漏洞,请发送电子邮件至 securityvuejs.org。…...
Linux 基础 6.进程
文章目录 6.1 进程和程序1. **程序 (Program)**2. **进程 (Process)**3. **程序与进程的区别**4. **进程的创建与执行**5. **总结** 6.2 进程号和父进程号1. **进程号 (PID)**2. **进程号的分配**3. **父进程号 (PPID)**4. **进程树结构**5. **进程号的限制与调整**6. **总结**…...
LeetCode:700.二叉搜索树中的搜索
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:700.二叉搜索树中的搜索 给定二叉搜索树(BST)的根节点 root 和一个整数值 val。 你…...
web实操9——session
概念 数据保存在服务器HttpSession对象里。 session也是域对象,有setAttribute和getAttribute方法 快速入门 代码 获取session和塞入数据: 获取session获取数据: 请求存储: 请求获取: 数据正常打印:…...
有哪几种方法可以使html脱离文档流?
position: absolute:会使元素脱离文档流,并且相对于最近的已定位的祖先元素进行定位。如果没有已定位的祖先元素,则相对于 <html> 元素定位。 元素脱离文档流,不再占据空间。 不会影响后续元素的位置和布局。 可以通过 top、right、…...
戴尔/Dell 电脑按什么快捷键可以进入 Bios 设置界面?
BIOS(基本输入输出系统)是计算机硬件与操作系统之间的桥梁,它负责初始化和测试系统硬件组件,并加载启动操作系统。在某些情况下,如调整启动顺序、更改系统时间或日期、修改硬件配置等,您可能需要进入BIOS进…...
Fast R-CNN模型详解及分析
模型背景 在目标检测领域的发展历程中,R-CNN系列模型标志着一个重要转折点。然而,在Fast R-CNN问世之前,这一领域的研究仍面临一些显著挑战: 计算效率低下 :早期模型如R-CNN和SPPNet虽然在准确性方面取得进展,但在计算效率上仍有待提高。特别是R-CNN需要多次运行CNN并单…...
android studio 写一个小计时器(版本二)
as版本:23.3.1patch2 例程:timer 在前一个版本的基本上改的,增加了继续的功能,实现方法稍微不同。 动画演示: activity_main.xml <?xml version"1.0" encoding"utf-8"?> <androidx…...
STM32完全学习——使用定时器1精确延时
一、定时器的相关配置 首先一定要是递减定时器,递增的不太行,控制的不够准确,其次在大于10微秒的延时是非常准确的,小于的话,就没有那没准,但是凑合能用。误差都在一个微秒以内。使用高级定时器也就是时钟…...
如何在 Ubuntu 22.04 上安装 Cassandra NoSQL 数据库教程
简介 本教程将向你介绍如何在 Ubuntu 22.04 上安装 Cassandra NoSQL 数据库。 Apache Cassandra 是一个分布式的 NoSQL 数据库,旨在处理跨多个普通服务器的大量数据,并提供高可用性,没有单点故障。Apache Cassandra 是一个高度可扩展的分布…...
【MATLAB第112期】基于MATLAB的SHAP可解释神经网络回归模型(敏感性分析方法)
【MATLAB第112期】基于MATLAB的SHAP可解释神经网络回归模型(敏感性分析方法) 引言 该文章实现了一个可解释的神经网络回归模型,使用BP神经网络(BPNN)来预测特征输出。该模型利用七个变量参数作为输入特征进行训练。为…...
小程序学习06——uniapp组件常规引入和easycom引入语法
目录 一 组件注册 1.1 组件全局注册 1.2 组件全局引入 1.3 组件局部引入 页面引入组件方式 1.3.1 传统vue规范: 1.3.2 通过uni-app的easycom 二 组件的类型 2.1 基础组件列表 一 组件注册 1.1 组件全局注册 (a)新建compoents文件…...
回归预测 | MATLAB实现CNN-BiLSTM-Attention多输入单输出回归预测
回归预测 | MATLAB实现CNN-BiLSTM-Attention多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-BiLSTM-Attention多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 一、方法概述 CNN-BiLSTM-Attention多输入单输出回归预测方法旨在通过融合CNN的局…...
直接插入排序、折半插入排序、2路插入排序、希尔排序
本篇是排序专栏博客的第一篇,主要探讨以 “插入” 为核心思想的排序算法该如何实现 文章目录 一、前言二、直接插入排序1. 算法思想与操作分析2. 代码实现version 1version 2 3. 复杂度分析 三、折半插入排序1. 算法思想与操作分析2. 代码实现3. 复杂度分析 四、2路…...
HTML-列表标签
列表是一系列排列好的项目,主要分成两类:有序列表和无序列表。 有序列表是每个列表项前面有编号,呈现出顺序,就像下面这样。 1. 列表项 A 2. 列表项 B 3. 列表项 C无序列表则是列表项前面没有编号,只有一个列表符号&…...
计算机网络原理(一)
嘿! 新年的第一篇博客,大家新年快乐呀!希望大家新的一年要多多进步噢! 1.TCP/IP的四层/五层参考模型有哪些层,各层的特点是?计算机网络分层的好处是? TCP/IP 四层参考模型 应用层:直接为用户…...
扩散模型论文概述(二):Google系列工作【学习笔记】
视频链接:扩散模型论文概述(二):Google系列工作_哔哩哔哩_bilibili 本视频讲的是Google在图像生成的工作。 同样,第一张图片是神作,总结的太好了! 在生成式AI的时代,OpenAI和Google不…...
第四届计算机、人工智能与控制工程
第四届计算机、人工智能与控制工程 The 4th International Conference on Computer, Artificial Intelligence and Control Engineering 重要信息 大会官网:www.ic-caice.net 大会时间:2025年1月10-12日 大会地点:中国合肥 (安徽大学磬苑…...
UE4.27 Android环境下获取手机电量
获取电量方法 使用的方法时FAndroidMisc::GetBatteryLevel(); 出现的问题 但是在电脑上编译时发现,会发现编译无法通过。 因为安卓环境下编译时,包含 #include "Android/AndroidPlatformMisc.h" 头文件是可以正常链接的,但在电…...
【人工智能】基于Python与OpenCV构建简单车道检测算法:自动驾驶技术的入门与实践
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着自动驾驶技术的快速发展,车道检测作为自动驾驶系统中的一个重要组成部分,起着至关重要的作用。本文将介绍如何利用Python与OpenCV库构…...
永磁同步电机控制算法--最大转矩电流比控制(牛顿迭代法)
一、原理介绍 搭建了基于牛顿迭代法的MTPA双闭环矢量控制系统 二、仿真验证 在MATLAB/simulink里面验证所提算法,采用和实验中一致的控制周期1e-4,电机部分计算周期为1e-6。仿真模型如下所示: 对直接公式计算法和牛顿迭代法进行仿真对比验…...
基于51单片机(STC32G12K128)和8X8彩色点阵屏(WS2812B驱动)的小游戏《贪吃蛇》
目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、定时器02、矩阵按键模块3、8X8彩色点阵屏 四、主函数总结 系列文章目录 前言 《贪吃蛇》,一款经典的、怀旧的小游戏,单片机入门必写程序。 以《贪吃蛇》为载体,熟悉各种屏幕…...
Ceph 手动部署(CentOS9)
#Ceph手动部署、CentOS9、squid版本、数字版本19.2.0 #部署服务:块、对象、文件 一、部署前规划 1、兼容性确认 2、资源规划 节点类型节点名称操作系统CPU/内存硬盘网络组件安装集群节点CephAdm01CentOS94U/8GOS:40G,OSD:2*100GIP1:192.169.0.9(管理&集群),IP2:…...
Reactor测试框架之StepVerifier
Reactor测试框架之StepVerifier 测试步骤1、创建StepVerifier实例2、添加断言3、执行验证 代码实例 在响应式编程中,Reactor框架提供了StepVerifier测试类,用于对响应式序列进行断言和验证。StepVerifier主要用于对Publisher发出的元素序列进行逐步的、精…...
unity 播放 序列帧图片 动画
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、方法一:代码控制播放序列帧1、设置图片属性2、创建Image组件3、简单的代码控制4、挂载代码并赋值 二、方法二:直接使用1.Image上添加…...
1-markdown转网页样式页面 --[制作网页模板] 【测试代码下载】
markdown转网页 将Markdown转换为带有样式的网页页面通常涉及以下几个步骤:首先,需要使用Markdown解析器将Markdown文本转换为HTML;其次,应用CSS样式来美化HTML内容。此外,还可以加入JavaScript以增加交互性。下面我将…...
ubuntu 创建服务、查看服务日志
1. 在 /etc/systemd/system/ 下创建文件,名称为 xxx.service [Unit] DescriptionYour Service Description Afternetwork.target[Service] Typesimple ExecStart/path/to/your/service/executable Restarton-failure[Install] WantedBymulti-user.target2. 配置服务…...
[python3]Excel解析库-openpyxl
https://openpyxl.readthedocs.io/en/stable/ openpyxl 是一个用于读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件的 Python 库。它允许开发者创建、修改和保存电子表格,而无需依赖 Microsoft Excel 软件本身。openpyxl 支持读取和写入 Excel 的工作簿(Work…...
使用 LlamaIndex 构建智能文档查询系统
使用 LlamaIndex 构建智能文档查询系统 1. 环境准备2. 初始化模型3. 加载文档4. 构建索引和查询引擎5. 生成扩展查询6. 主函数7. 总结 在现代信息检索系统中,如何高效地从大量文档中提取出有用的信息是一个重要的挑战。本文将介绍如何使用 LlamaIndex 构建一个智能文…...
C++——继承
目录 前言 1. 继承的概念和定义 1.1 继承的概念 1.2 继承的定义 1.2.1 定义格式 1.2.2 继承基类成员访问方式的变化 1.3 继承类模板 2. 基类和派生类之间的转换 3. 继承中的作用域 3.1 隐藏规则 3.2 考察继承作用域相关选择题 4. 派生类的默认成员函数 4.1 4个常…...
01:C语言的本质
C语言的本质 1、ARM架构与汇编2、局部变量初始化与空间分配2.1、局部变量的初始化2.1、局部变量数组初始化 3、全局变量/静态变量初始化化与空间分配4、堆空间5、函数 1、ARM架构与汇编 ARM简要架构如下:CPU,ARM(能读能写),Flash(…...
Jmeter进阶篇(32)Jmeter 在 MySQL 数据库压测中的应用
一、引言 在当今数字化时代,数据库性能的优化对于企业的发展至关重要。随着业务量的不断增长,数据库需要承受越来越大的压力。MySQL作为一种广泛使用的开源数据库,其性能和稳定性备受关注。为了确保数据库在高负载情况下能够正常运行,进行压测是必不可少的环节。Jmeter作为…...
TCPDump参数详解及示例
TCPDump参数详解及示例 TCPDump参数详解TCPDump -G的示例TCPDump -i any -s 2048 -G 600 -p udp -Z root -n -X -tt -w %Y_%m%d_%H%M_%S.pcap &的含义TCPDump是一款强大的网络数据包截获分析工具,可以将网络中传送的数据包的完全截获下来提供分析。它支持针对网络层、协议…...
Protocol Buffer
1、什么是 Protocol Buffers? Protocol Buffers (protobuf) 是一种序列化结构化数据的方法,由 Google 开发。它们提供了一种与语言无关、与平台无关且可扩展的机制,用于高效序列化结构化数据。 Protocol Buffers 中的…...
高等数学学习笔记 ☞ 连续与间断
1. 连续 1. 点连续定义: 设函数在点的某邻域内有定义,取附近的点,对应的函数值分别和, 令,当时,若,则称函数在点处连续。 记作。 此式为增量形式。 又知,则可改写为:。 …...
【three.js】Shader着色器
原始着色器材质RawShaderMaterial 两种着色器材质的 RawShaderMaterial 和 ShaderMaterial 的区别和用法 区别: ShaderMaterial 会自动将一些初始化着色器的参数添加到代码中(内置 attributes 和 uniforms) RawShaderMaterial 则什么都不会添…...
在 macOS 中,设置自动将文件夹排在最前
文章目录 1、第一步访达设置2、第二步排序方式 需要两步设置 1、第一步访达设置 按名称排序的窗口中 2、第二步排序方式 选择名称...
创建并配置华为云虚拟私有云
目录 私有云 创建虚拟私有云 私有云 私有云是一种云计算模式,它将云服务部署在企业或组织内部的私有基础设施上,仅供该企业或组织内部使用,不对外提供服务.私有云的主要特点包括: 私密性:私有云的资源(如…...
Spark是什么?Flink和Spark区别
Spark是什么?Flink和Spark区别 一、Spark二、Spark和Flink区别三、总结 一、Spark Apache Spark 是一个开源的大数据处理框架,主要用于大规模数据处理和分析。它支持多种数据处理模式,包括批处理、流处理、SQL 查询、机器学习和图处理等。 核…...
代码随想录 day 25
第七章 回溯算法 part04 491.递增子序列 本题和大家刚做过的 90.子集II 非常像,但又很不一样,很容易掉坑里。 https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html 视频讲解:https://www.bilibili.com/…...
数据仓库中的指标体系模型介绍
数据仓库中的指标体系介绍 文章目录 数据仓库中的指标体系介绍前言什么是指标体系指标体系设计有哪些模型?1. 指标分层模型2. 维度模型3. 指标树模型4. KPI(关键绩效指标)模型5. 主题域模型6.平衡计分卡(BSC)模型7.数据指标框架模…...
xr-frame 通过shader去除视频背景色,加载透明视频
目录 前言 实现思路 获取 XR 框架系统: 注册自定义效果 创建效果对象 渲染通道配置 着色器代码 顶点着色器 片元着色器(颜色分量g达到条件的片元将被透透明) effect-removeBlack 完整代码 wxml中使用 前言 实现了一个用于注册自定…...