当前位置: 首页 > news >正文

Dockerfile的ENV

文章目录

  • 环境
  • 总结
  • 测试
    • 测试1
    • 测试2
    • 测试3
    • 测试4
    • 测试5
    • 测试6
  • 参考

环境

  • RHEL 9.3
  • Docker Community 24.0.7

总结

如果懒得看测试的详细信息,可以直接看结果:

  • 一条 ENV 指令可以定义多个环境变量。
  • Dockerfile里可以包含多条 ENV 指令。
  • 环境变量的值不需要用双引号引起来,如果用了双引号,也会自动被去掉。
  • 环境变量的值如果包含空格,可以用双引号引起来,或者用 \ 将其转义。
  • 环境变量的值如果包含双引号,可以用 \ 将其转义。
  • ENV 指令里可以引用之前的 ENV 指令里定义的环境变量。
  • 在同一条 ENV 指令里,无法互相引用:
    • 如果是本条指令里新定义的变量,则当作没有定义。
    • 如果是之前指令里定义过,本条指令里有修改的变量,则获取的仍然是之前指令里的值。
  • 在启动容器时,可以通过 --env 选项覆盖Dockerfile里设置的环境变量。
  • stage会继承其parent image的环境变量。
  • 如果只是构建期的变量,不要用 ENV 指令,否则会影响image使用。
  • 如果想要unset变量,需要把set和unset放到同一个 RUN 指令里。

测试

测试1

创建 Dockerfile 文件如下:

FROM alpineENV VAR1=value1 VAR2="value2" VAR3="hello world" \VAR4=hello\ world ENV VAR5="He said: \"It's good!\""

构建:

docker build -t kai0108_1 .

启动容器,查看环境变量:

➜  ~ docker run kai0108_1 env
VAR1=value1
VAR2=value2
VAR3=hello world
VAR4=hello world
VAR5=He said: "It's good!"

注:只列出了相关的环境变量。

总结:

  • 一条 ENV 指令可以定义多个环境变量。
  • Dockerfile里可以包含多条 ENV 指令。
  • 环境变量的值不需要用双引号引起来,如果用了双引号,也会自动被去掉。
  • 环境变量的值如果包含空格,可以用双引号引起来,或者用 \ 将其转义。
  • 环境变量的值如果包含双引号,可以用 \ 将其转义。

测试2

创建 Dockerfile 文件如下:

FROM alpineENV VAR1=value1 VAR2=aaa${VAR1}bbbENV VAR3=ccc${VAR1}dddENV VAR4=value4ENV VAR5=aaa${VAR4}bbb VAR6=ccc${VAR5}dddENV VAR7=value7ENV VAR7=value8 VAR8=aaa${VAR7}bbb

启动容器,查看环境变量:

➜  ~ docker run kai0108_2 env
VAR1=value1
VAR2=aaabbb
VAR3=cccvalue1ddd
VAR4=value4
VAR5=aaavalue4bbb
VAR6=cccddd
VAR7=value8
VAR8=aaavalue7bbb

总结:

  • ENV 指令里可以引用之前的 ENV 指令里定义的环境变量。
  • 在同一条 ENV 指令里,无法互相引用:
    • 如果是本条指令里新定义的变量,则当作没有定义。
    • 如果是之前指令里定义过,本条指令里有修改的变量,则获取的仍然是之前指令里的值。

测试3

创建 Dockerfile 文件如下:

FROM alpineENV VAR1=value1

启动容器,设置环境变量 VAR1

➜  ~ docker run --env VAR1=hello kai0108_3 env
VAR1=hello

总结:

  • 在启动容器时,可以通过 --env 选项覆盖Dockerfile里设置的环境变量。

测试4

创建 Dockerfile 文件如下:

FROM alpine AS baseENV VAR1=value1FROM baseENV VAR2=aaa${VAR1}bbb

启动容器,查看环境变量:

➜  ~ docker run kai0108_4 env
VAR1=value1
VAR2=aaavalue1bbb

总结:

  • stage会继承其parent image的环境变量。

测试5

创建 Dockerfile 文件如下:

FROM ubuntu:trustyENV DEBIAN_FRONTEND=noninteractiveRUN apt-get update && apt-get install -y curl

注: DEBIAN_FRONTEND=noninteractive 表示在 apt-get install 安装的过程中,使用缺省设置,不与用户交互(比如弹出对话框),当然如果不加 -y 选项,还是会让用户确认安装的。在构建时,无法与用户交互,所以要设置该环境变量(本例中安装 curl 其实并不会弹出对话框,只是个示例)。

构建:

docker build -t kai0108_5 .

注:构建会非常慢,因为要连接国外的网站。

启动容器,并进入容器:

docker run -it kai0108_5

安装 mail-stack-delivery

apt-get -y install mail-stack-delivery

注:这里安装 mail-stack-delivery ,只是为了测试安装过程中是否会弹出对话框。

在安装过程中,本来应该会弹出如下对话框:

在这里插入图片描述

但是实际上并没有弹出对话框。

原因很简单,因为有环境变量 DEBIAN_FRONTEND=noninteractive

本来,设置该环境变量只是为了在构建image时不与用户交互,但是在image里也保留了该环境变量,以至于影响了 apt-get install 的行为,这可能会对用户造成困扰。

解决办法有两种:

  • 方法1:在 RUN 指令里设置环境变量,只对本指令有效:
RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y curl
  • 方法2:通过 ARG 指令设置变量,只在构建期有效:
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y curl

总结:

  • 如果只是构建期的变量,不要用 ENV 指令,否则会影响image使用。

测试6

创建 Dockerfile 文件如下:

FROM alpineENV VAR1=value1RUN echo aaa${VAR1}bbb > /tmp/a.txtRUN unset VAR1RUN echo ccc${VAR1}ddd > /tmp/b.txt

构建:

docker build -t kai0108_6 .

启动容器,并进入容器查看:

➜  ~ docker run -it kai0108_6
/ # cat /tmp/a.txt
aaavalue1bbb
/ # cat /tmp/b.txt
cccvalue1ddd
/ # env
VAR1=value1
......

可见,unset变量并不起作用。这是因为 ENV 指令会创建一个layer。

若想要unset变量,需要把set和unset放到同一个layer里,也就是同一个 RUN 指令里。

创建 Dockerfile 文件如下:

FROM alpineRUN export VAR1=value1 \&& echo aaa${VAR1}bbb > /tmp/a.txt \&& unset VAR1 \&& echo ccc${VAR1}ddd > /tmp/b.txtRUN echo eee${VAR1}fff > /tmp/c.txt

构建:

docker build -t kai0108_7 .

启动容器,并进入容器查看:

➜  ~ docker run -it kai0108_7
/ # cat /tmp/a.txt
aaavalue1bbb
/ # cat /tmp/b.txt
cccddd
/ # cat /tmp/c.txt
eeefff
/ # env
HOSTNAME=13dcd240cd01
SHLVL=1
HOME=/root
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/

可见,这次达到了预期的目的。

总结:

  • 如果想要unset变量,需要把set和unset放到同一个 RUN 指令里。

参考

  • https://docs.docker.com/engine/reference/builder/#env
  • https://docs.docker.com/develop/develop-images/instructions/#env

相关文章:

Dockerfile的ENV

文章目录 环境总结测试测试1测试2测试3测试4测试5测试6 参考 环境 RHEL 9.3Docker Community 24.0.7 总结 如果懒得看测试的详细信息,可以直接看结果: 一条 ENV 指令可以定义多个环境变量。Dockerfile里可以包含多条 ENV 指令。环境变量的值不需要用…...

【普中开发板】基于51单片机的简易密码锁设计( proteus仿真+程序+设计报告+讲解视频)

基于51单片机的简易密码锁设计 1.主要功能:资料下载链接: 实物图:2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单 【普中】基于51单片机的简易密码锁设计 ( proteus仿真程序设计报告讲解视频) 仿真图proteus8.16(有低版本) 程…...

c语言之输出函数用法 putchar

putchar函数 putchar函数是c语言输出函数&#xff0c;但它只能输出单个字符&#xff0c;如果要输出字符串就不合适了。 应用举例 #include<stdio.h> int main() {putchar(a);putchar(4);putchar(\n);return 0: } 从上面代码可以看出&#xff0c;单字符必须用单引号’…...

高精度原边控制电路D3820,CC/CV精度±5%以内,可作为10W以下小功率、低待机功耗的电源替代,可兼容OB2520

高精度原边控制离线式PWM功率开关 特点 1、全电压范围CC/CV精度保持在5%以内 2、用原边控制&#xff0c;无需TL431和光耦 3、欠压锁定&#xff08;UVLO&#xff09;及自动重启 4、驱动BJT 5、内置前沿消隐&#xff08;LEB&#xff09; 6、逐周期限流模式 7、输出线压降…...

Python库学习(十四):ORM框架-SQLAlchemy

1.介绍 SQLAlchemy 是一个用于 Python 的 SQL 工具和对象关系映射&#xff08;ORM&#xff09;库。它允许开发者通过 Python 代码而不是 SQL查询语言来操作数据库。SQLAlchemy 提供了一种灵活且强大的方式来与关系型数据库交互&#xff0c;支持多种数据库后端&#xff0c;如 P…...

信息学奥赛一本通1014:与圆相关的计算

1014&#xff1a;与圆相关的计算 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 167892 通过数: 85008 【题目描述】 给出圆的半径&#xff0c;求圆的直径、周长和面积。输入圆的半径实数r&#xff0c;输出圆的直径、周长、面积&#xff0c;每个数保留小数点后4…...

Vscode——通过SSH连接服务器

1、打开vscode —— 点击左下角 2、选择SSH 3、点击后会自动安装三个插件 4、点击左下角——连接服务器 5、再次点击左下角——连接服务器 6、登录成功后打开终端即可操作 快捷键&#xff1a;ctrl ~ 7、查看编辑服务器文件目录 点击文件——打开文件夹 8、确定后再次输入登录密…...

UE5 通过接口实现角色描边效果

接口不能够被实例化&#xff0c;不能够在内部书写函数的逻辑和设置属性&#xff0c;只能够被继承使用。它能够让不同的类实现有相同的函数&#xff0c;继承接口的类必须实现接口的函数。 并且&#xff0c;我们可以在不同的类里面的函数实现也不同&#xff0c;比如A类描边是红色…...

电脑提示dll丢失怎么办,教你一招将dll修复

使用电脑时&#xff0c;你的电脑是否出现关于dll文件丢失或找不到的问题&#xff0c;出现这种问题又该如何解决呢&#xff0c;dll文件问题会导致软件无法打开&#xff0c;或者会导致系统崩溃。今天就来教大家如何快速解决dll文件修复。 一.如何修复dll修复 方法一&#xff1a;…...

MATLAB mat 文件

1.mat文件格式 MATLAB&#xff08;Matrix Laboratory&#xff09;使用 .mat 文件格式来存储和加载数据。MAT 文件是一种二进制文件格式&#xff0c;能够保存 MATLAB 中的各种数据类型&#xff0c;包括矩阵、向量、结构体、元胞数组等。 特定和用途&#xff1a; 二进制格式&a…...

Linux du和df命令

目录 一. df二. du 一. df ⏹用于显示系统级别&#xff0c;磁盘分区上的可用和已用空间的信息 -h&#xff1a;以人类可读的格式显示文件系统大小 ⏹每秒钟监视当前磁盘的使用情况 watch 用于周期性的执行特定的命令-n 1 表示每一秒刷新一次命令执行的结果df -h ./ 表示周期性…...

Adobe Photoshop 快捷键

PS快捷键 图层 选择图层 Ctrl T&#xff1a;可以对图层的大小和位置进行调整 填充图层 MAC: AltBackspace (前景) or CtrlBackspace (背景) WINDOWS: AltDelete (前景) or CtrlDelete (背景) 快速将图层填充为前景色或背景色 平面化图层&#xff08;盖印图层&#xff09…...

缓存代理服务器

1 缓存代理 1.1 缓存代理的概述 web代理的作用 缓存网页对象&#xff0c;减少重复请求 存储一些之前被访问的或且可能将要备再次访问的静态网页资源对象&#xff0c;使用户可以直接从缓存代理服务器获取资源&#xff0c;从而减少上游原始服务器的负载压力&#xff0c;加快整…...

四道面试题

一.网络的七层模型 网络的七层模型&#xff0c;也被称为OSI七层协议模型&#xff0c;是一种用于理解和描述网络通信过程的概念模型。这个模型将网络通信过程划分为七个层次&#xff0c;从低到高分别是&#xff1a;物理层、数据链路层、网络层、传输层、会话层、表示层和应用层…...

BRC20 技术分析

文章目录 什么是 BRC20 ?brc20 白皮书。重点基于链上数据解析获取交易详情返回值如何将 16 进制转换为 字符串没有节点,如何获取数据?见证隔离如何解析出 BRC20 数据?最后如何快速搭建节点BRC20 Indexer...

【Unity】Timer计时器属性及使用

可以代替协程完成延时操作 可以不用Update进行计时 GitHub开源计时插件 网址&#xff1a;https://github.com/akbiggs/UnityTimer/tree/master 导入&#xff1a;URL&#xff1a;https://github.com/akbiggs/UnityTimer.git 基本功能&#xff1a; 创建计时器&#xff1a; Time…...

Salesforce lightning优势介绍

今天我要给大家说说&#xff0c;Salesforce的两个版本&#xff1a;第一代Classic UI&#xff0c;和13年以来为迎接移动化趋势而推出的新Lightning UI。Classic马上就要和我们说88了&#xff0c;那Lightning究竟有哪些大杀器让我们无法抗拒呢&#xff1f;让我们一探究竟吧。 首先…...

leaflet学习笔记-贝塞尔曲线绘制(八)

前言 两点之间的连线是很常见的&#xff0c;但是都是直直的一条线段&#xff0c;为了使连线更加平滑&#xff0c;我们可以使用曲线进行连线&#xff0c;本功能考虑使用贝塞尔曲线进行连线绘制&#xff0c;最后将线段的两端节点连接&#xff0c;返回一个polygon。 贝塞尔简介 …...

42-单双多路分支,嵌套分支,switch分支,for循环,for in,while,do while,break,continue

js流程控制&#xff0c;代码的执行机制&#xff1a;顺序控制&#xff0c;分支控制&#xff0c;循环控制 1.顺序控制&#xff1a;就是按照代码的书写顺序&#xff0c;自上而下执行 2.分支控制 2.1单路分支 // 单路分支// if(条件表达式){// 执行代码// }// 如果条件表达式满…...

CNCF之CoreDNS

目前我们学习云原生技术&#xff0c;就不得不去了解CNCF&#xff0c;即Cloud Native Computing Foundation&#xff0c;云原生计算基金会&#xff0c;它的宣言或理念是&#xff1a; The Cloud Native Computing Foundation (CNCF) hosts critical components of the global tec…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用

前言&#xff1a;我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM&#xff08;Java Virtual Machine&#xff09;让"一次编写&#xff0c;到处运行"成为可能。这个软件层面的虚拟化让我着迷&#xff0c;但直到后来接触VMware和Doc…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器

一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下&#xff0c;音视频内容犹如璀璨繁星&#xff0c;点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频&#xff0c;到在线课堂中知识渊博的专家授课&#xff0c;再到影视平台上扣人心弦的高清大片&#xff0c;音…...