掌握 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(与上述支持的指令之一组合时)

RUNCMDENTRYPOINT 中的环境变量

您还可以将环境变量与RUNCMDENTRYPOINT 指令一起使用。但在这些指令中,变量替换是由命令 shell 处理的,而不是由构建器处理的。

环境变量的作用范围

在 Dockerfile 中,环境变量的替换在整个指令中使用相同的值。修改环境变量的值仅对后续的指令生效。

ENV abc=hello
ENV abc=bye def=$abc
ENV ghi=$abc

在这个例子中:

  • def 的值变为hello

  • ghi 的值变为bye

总结

Dockerfile 是构建 Docker 镜像的核心工具,理解和掌握常用指令及解析器指令的使用,能够帮助您高效地构建镜像并简化 DevOps 流程。通过合理设置环境变量和优化构建过程,您可以提升应用程序的可移植性和可维护性。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式linux中socket控制与实现

一、概述 1、首先网络,一看到这个词,我们就会想到IP地址和端口号,那IP地址和端口各有什么作用呢? (1)IP地址如身份证一样,是标识的电脑的,一台电脑只有一个IP地址。 (2)端口提供了一种访问通道,服务器一般都是通过知名端口号来识别某个服务。例如,对于每个TCP/IP实…

VScode SSH 错误:Got bad result from install script 解決

之前vscode好好的,某天突然连接报错如下 尝试1. 服务器没有断开,ssh可以正常连接 2. 用管理员权限运行vscode,无效 3. 删除服务器上的~/.vscode-server 文件夹,无效 试过很多后,原来很可能是前一天anaconda卸载导致注册表项 步…

GPT分区 使用parted标准分区划分,以及相邻分区扩容

parted 是一个功能强大的命令行工具,用于创建和管理磁盘分区表和分区。它支持多种分区表类型,如 MBR(msdos)、GPT(GUID Partition Table)等,并且可以处理大容量磁盘。parted 提供了一个交互式界…

关系分类(RC)模型和关系抽取(RE)模型的区别

目标不同 关系分类模型:对给定的实体对在给定句子中预测其关系类型。两阶段(RC) 关系抽取模型:从句子中识别出所有潜在实体对,并为其预测关系类型。一阶段(NERRE) 训练/预测阶段输入输出数据不…

VSCode编辑+GCC for ARM交叉编译工具链+CMake构建+OpenOCD调试(基于STM32的标准库/HAL库)

一、CMake安装 进入CMake官网的下载地址Get the Software,根据系统安装对应的Binary distributions。 或者在CMake——国内镜像获取二进制镜像安装包。 或者访问GitHub的xPack项目xPack CMake v3.28.6-1,下载即可。 记得添加用户/系统的环境变量&#…

【数据结构】链表(2):双向链表和双向循环链表

双向链表(Doubly Linked List) 定义: 每个节点包含三个部分: 数据域。前驱指针域(指向前一个节点)。后继指针域(指向下一个节点)。 支持从任意节点向前或向后遍历。 #define dat…

RK3588+麒麟国产系统+FPGA+AI在电力和轨道交通视觉与采集系统的应用

工业视觉识别系统厂家提供的功能主要包括: 这些厂家通过先进的视觉识别技术,实现图像的采集、处理与分析。系统能够自动化地完成质量检测、物料分拣、设备监控等任务,显著提升生产效率和产品质量。同时,系统具备高度的灵活性和可扩…

3 抢红包系统

我们还是按照我们分析问题的方法论开展 一 场景分析 我们分析的是集体活动的抢红包,比如春晚,大型活动红包,需要在网页操作的抢红包 抢红包的问题也是多个人抢资源的问题,可以和秒杀进行比对。但是也有很多不同的地方。 用户打…

数据库中的并发控制

并发操作带来的数据不一致性 1、并发控制:为了保证事务的隔离性和一致性,数据库管理系统需要对并发操作进行正确调度 并发控制的主要技术有:封锁、时间戳、乐观控制法、多版本并发控制等 并发操作带来的数据不一致性: ① 丟失修改:两个事务 T1 和 T2 读入同一数据…

ArcGIS Server 10.2授权文件过期处理

新的一年,arcgis server授权过期了,服务发不不了。查看ecp授权文件,原来的授权日期就到2024.12.31日。好吧,这里直接给出处理方法。 ArcGIS 10.2安装时,有的破解文件中会有含一个这样的注册程序,没有的话&…

学英语学压测:02jmeter组件-测试计划和线程组ramp-up参数的作用

📢📢📢:先看关键单词,再看英文,最后看中文总结,再回头看一遍英文原文,效果更佳!! 关键词 Functional Testing功能测试[ˈfʌŋkʃənəl ˈtɛstɪŋ]Sample样…

MCGS学习记录

软件包 用户窗口 主窗口 元件:工具箱->输入框上面 数据对象 在工作台的实时数据库可以新增数据对象 理解为中间变量,控件改变其值,控件监测其值做出变化 基本属性 设定变量名和初始值 指针化? 变化时自动保存初始值&#x…

【网络协议】IPv4 地址分配 - 第一部分

文章目录 十进制与二进制网络如何被寻址地址类型网络地址广播地址主机地址 如何确定网络和主机部分的位数?网络中的主机数量与前缀号的关系计算每个前缀的主机数量公式 子网掩码二进制与操作(Binary ANDing)与操作(AND Operation&…

数据挖掘——集成学习

数据挖掘——集成学习 集成学习Bagging:有放回采样随机森林 BoostingStacking 集成学习 集成学习(Ensemble learning)方法通过组合多种学习算法来获得比单独使用任何一种算法更好的预测性能。 动机是为了提高但分类器的性能 Bagging&…

ansible-性能优化

一. 简述: 搞过运维自动化工具的人,肯定会发现很多运维伙伴们经常用saltstack和ansible做比较,单从执行效率上来说,ansible确实比不上saltstack(ansible使用的是ssh,salt使用的是zeromq消息队列[暂没深入了解]),但其实…

NLP CH10 问答系统复习

1. 专家系统 特点 问题聚焦:限定在特定领域。数据结构化:使用结构化的领域知识。数据库支持:后台有一个数据库,保存系统可提供的各种数据。查询机制:用户提问时,系统将问题转换为 SQL 查询语句&#xff0…

vite6+vue3+ts+prettier+eslint9配置前端项目(后台管理系统、移动端H5项目通用配置)

很多小伙伴苦于无法搭建一个规范的前端项目,导致后续开发不规范,今天给大家带来一个基于Vite6TypeScriptVue3ESlint9Prettier的搭建教程。 目录 一、基础配置1、初始化项目2、代码质量风格的统一2.1、配置prettier2.2、配置eslint2.3、配置typescript 3、…

【2025年最新】OpenWrt 更换国内源的指南(图形界面版)

在上一篇文章中我们讲解了如何使用命令行更换国内源,如果你没有终端工具,或者不喜欢命令行,那么图形界面方式将会是更简单有效的方式。 命令行版本:【2025年最新】OpenWrt 更换国内源的指南(命令行)-CSDN博客 为什么选择通过图形…

uni-app:实现普通选择器,时间选择器,日期选择器,多列选择器

效果 选择前效果 1、时间选择器 2、日期选择器 3、普通选择器 4、多列选择器 选择后效果 代码 <template><!-- 时间选择器 --><view class"line"><view classitem1><view classleft>时间</view><view class"right&quo…

NVIDIA DLI课程《NVIDIA NIM入门》——学习笔记

先看老师给的资料&#xff1a; NVIDIA NIM是 NVIDIA AI Enterprise 的一部分&#xff0c;是一套易于使用的预构建容器工具&#xff0c;目的是帮助企业客户在云、数据中心和工作站上安全、可靠地部署高性能的 AI 模型推理。这些预构建的容器支持从开源社区模型到 NVIDIA AI 基础…