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/#envhttps://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语言输出函数,但它只能输出单个字符,如果要输出字符串就不合适了。 应用举例 #include<stdio.h> int main() {putchar(a);putchar(4);putchar(\n);return 0: } 从上面代码可以看出,单字符必须用单引号’…...
高精度原边控制电路D3820,CC/CV精度±5%以内,可作为10W以下小功率、低待机功耗的电源替代,可兼容OB2520
高精度原边控制离线式PWM功率开关 特点 1、全电压范围CC/CV精度保持在5%以内 2、用原边控制,无需TL431和光耦 3、欠压锁定(UVLO)及自动重启 4、驱动BJT 5、内置前沿消隐(LEB) 6、逐周期限流模式 7、输出线压降…...
Python库学习(十四):ORM框架-SQLAlchemy
1.介绍 SQLAlchemy 是一个用于 Python 的 SQL 工具和对象关系映射(ORM)库。它允许开发者通过 Python 代码而不是 SQL查询语言来操作数据库。SQLAlchemy 提供了一种灵活且强大的方式来与关系型数据库交互,支持多种数据库后端,如 P…...
信息学奥赛一本通1014:与圆相关的计算
1014:与圆相关的计算 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 167892 通过数: 85008 【题目描述】 给出圆的半径,求圆的直径、周长和面积。输入圆的半径实数r,输出圆的直径、周长、面积,每个数保留小数点后4…...
Vscode——通过SSH连接服务器
1、打开vscode —— 点击左下角 2、选择SSH 3、点击后会自动安装三个插件 4、点击左下角——连接服务器 5、再次点击左下角——连接服务器 6、登录成功后打开终端即可操作 快捷键:ctrl ~ 7、查看编辑服务器文件目录 点击文件——打开文件夹 8、确定后再次输入登录密…...
UE5 通过接口实现角色描边效果
接口不能够被实例化,不能够在内部书写函数的逻辑和设置属性,只能够被继承使用。它能够让不同的类实现有相同的函数,继承接口的类必须实现接口的函数。 并且,我们可以在不同的类里面的函数实现也不同,比如A类描边是红色…...
电脑提示dll丢失怎么办,教你一招将dll修复
使用电脑时,你的电脑是否出现关于dll文件丢失或找不到的问题,出现这种问题又该如何解决呢,dll文件问题会导致软件无法打开,或者会导致系统崩溃。今天就来教大家如何快速解决dll文件修复。 一.如何修复dll修复 方法一:…...
MATLAB mat 文件
1.mat文件格式 MATLAB(Matrix Laboratory)使用 .mat 文件格式来存储和加载数据。MAT 文件是一种二进制文件格式,能够保存 MATLAB 中的各种数据类型,包括矩阵、向量、结构体、元胞数组等。 特定和用途: 二进制格式&a…...
Linux du和df命令
目录 一. df二. du 一. df ⏹用于显示系统级别,磁盘分区上的可用和已用空间的信息 -h:以人类可读的格式显示文件系统大小 ⏹每秒钟监视当前磁盘的使用情况 watch 用于周期性的执行特定的命令-n 1 表示每一秒刷新一次命令执行的结果df -h ./ 表示周期性…...
Adobe Photoshop 快捷键
PS快捷键 图层 选择图层 Ctrl T:可以对图层的大小和位置进行调整 填充图层 MAC: AltBackspace (前景) or CtrlBackspace (背景) WINDOWS: AltDelete (前景) or CtrlDelete (背景) 快速将图层填充为前景色或背景色 平面化图层(盖印图层)…...
缓存代理服务器
1 缓存代理 1.1 缓存代理的概述 web代理的作用 缓存网页对象,减少重复请求 存储一些之前被访问的或且可能将要备再次访问的静态网页资源对象,使用户可以直接从缓存代理服务器获取资源,从而减少上游原始服务器的负载压力,加快整…...
四道面试题
一.网络的七层模型 网络的七层模型,也被称为OSI七层协议模型,是一种用于理解和描述网络通信过程的概念模型。这个模型将网络通信过程划分为七个层次,从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层…...
BRC20 技术分析
文章目录 什么是 BRC20 ?brc20 白皮书。重点基于链上数据解析获取交易详情返回值如何将 16 进制转换为 字符串没有节点,如何获取数据?见证隔离如何解析出 BRC20 数据?最后如何快速搭建节点BRC20 Indexer...
【Unity】Timer计时器属性及使用
可以代替协程完成延时操作 可以不用Update进行计时 GitHub开源计时插件 网址:https://github.com/akbiggs/UnityTimer/tree/master 导入:URL:https://github.com/akbiggs/UnityTimer.git 基本功能: 创建计时器: Time…...
Salesforce lightning优势介绍
今天我要给大家说说,Salesforce的两个版本:第一代Classic UI,和13年以来为迎接移动化趋势而推出的新Lightning UI。Classic马上就要和我们说88了,那Lightning究竟有哪些大杀器让我们无法抗拒呢?让我们一探究竟吧。 首先…...
leaflet学习笔记-贝塞尔曲线绘制(八)
前言 两点之间的连线是很常见的,但是都是直直的一条线段,为了使连线更加平滑,我们可以使用曲线进行连线,本功能考虑使用贝塞尔曲线进行连线绘制,最后将线段的两端节点连接,返回一个polygon。 贝塞尔简介 …...
42-单双多路分支,嵌套分支,switch分支,for循环,for in,while,do while,break,continue
js流程控制,代码的执行机制:顺序控制,分支控制,循环控制 1.顺序控制:就是按照代码的书写顺序,自上而下执行 2.分支控制 2.1单路分支 // 单路分支// if(条件表达式){// 执行代码// }// 如果条件表达式满…...
CNCF之CoreDNS
目前我们学习云原生技术,就不得不去了解CNCF,即Cloud Native Computing Foundation,云原生计算基金会,它的宣言或理念是: The Cloud Native Computing Foundation (CNCF) hosts critical components of the global tec…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
