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 alpine

ENV 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 alpine

ENV VAR1=value1 VAR2=aaa${VAR1}bbb

ENV VAR3=ccc${VAR1}ddd

ENV VAR4=value4

ENV VAR5=aaa${VAR4}bbb VAR6=ccc${VAR5}ddd

ENV VAR7=value7

ENV 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 alpine

ENV VAR1=value1

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

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

总结:

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

测试4

创建 Dockerfile 文件如下:

FROM alpine AS base

ENV VAR1=value1

FROM base

ENV VAR2=aaa${VAR1}bbb

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

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

总结:

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

测试5

创建 Dockerfile 文件如下:

FROM ubuntu:trusty

ENV DEBIAN_FRONTEND=noninteractive

RUN 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 alpine

ENV VAR1=value1

RUN echo aaa${VAR1}bbb > /tmp/a.txt

RUN unset VAR1

RUN 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 alpine

RUN export VAR1=value1 \
    && echo aaa${VAR1}bbb > /tmp/a.txt \
    && unset VAR1 \
    && echo ccc${VAR1}ddd > /tmp/b.txt

RUN 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

崩坏:星穹铁道「V1.5攻略」绥园新增隐藏任务攻略-巡镝篇

这里是闲游盒小盒子,本期为大家带来的是1.5版本绥园地图内的隐藏任务攻略,希望能对各位开拓者有帮助。 01.小鬼心愿(赞许*1) 与青丘台入口旁的小鬼对话接取任务,带它去任务目标点即可。 02.眼一直闭(成就*…

Devtools热部署

1.添加Devtools jra <groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional> </dependency>2.添加plugin插件 <build><…

K8S--持久卷(PersistentVolume)的用法

原文网址&#xff1a;K8S--持久卷(PersistentVolume)的用法-CSDN博客 简介 本文介绍K8S的持久卷(PersistentVolume)的用法。 目标&#xff1a;用持久卷的方式将主机的磁盘与容器磁盘映射&#xff0c;安装nginx并运行。 --------------------------------------------------…

关于对象存储的若干事

引言 最近在阅读鸣嵩的一篇文章&#xff0c;数据库的下一场革命&#xff1a;S3 延迟已降至原先的 10%&#xff0c;云数据库架构该进化了 收获很多&#xff0c;过去时间也基于对象存储做过一些功能实现&#xff0c;特记录下。关于鸣嵩&#xff1a; 曹伟&#xff0c;花名鸣嵩&am…

MySQL视图 索引 面试题

一. 视图 视图&#xff1a;一种虚拟存在的表&#xff0c;行和列的数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的&#xff0c;只保存了sql逻辑&#xff0c;不保存查询结果 视图语法 -- 创建 create view 视图名 as 查询语句;-- 使用 select * f…

大数据 Yarn - 资源调度框架

Hadoop主要是由三部分组成&#xff0c;除了前面我讲过的分布式文件系统HDFS、分布式计算框架MapReduce&#xff0c;还有一个是分布式集群资源调度框架Yarn。 但是Yarn并不是随Hadoop的推出一开始就有的&#xff0c;Yarn作为分布式集群的资源调度框架&#xff0c;它的出现伴随着…

Cache伪共享

伪共享 什么是伪共享 为了解决计算机系统中主内存与CPU之间运行速度差问题&#xff0c;会在CPU与主内存之间添加一级或者多级高速缓冲存储器(Cache)。 这个Cache一般是被集成到CPU内部的&#xff0c;所以也叫CPU Cache。 在Cache内部是按行存储的&#xff0c;其中每一行称为…

springboot 房屋租赁系统

spring boot mysql mybatis 前台后端

【二】使用create-vue创建vue3的helloworld项目(推荐)

create-vue 官网&#xff1a;快速上手 | Vue.js create-vue 是 Vue3 的专用脚手架&#xff0c;使用 vite 创建 Vue3 的项目&#xff0c;也可以选择安装需要的各种插件&#xff0c;使用更简单。 1、使用方式 npm create vuelatest这个命令会安装和执行 create-vue&#xff0…

位运算--二进制中1的个数(含常见的二进制运算操作)

目录 二进制中1的个数操作 1 查看第k位的数字是否为1操作2 lowbit操作 解题代码&#xff1a; 原题链接: 二进制中1的个数 给定一个长度为 n 的数列&#xff0c;请你求出数列中每个数的二进制表示中 1 的个数。 输入格式 第一行包含整数 n 。 第二行包含 n 个整数&#xff0c…

聚道云软件连接器助力某新能源行业公司实现付款流程自动化

客户介绍&#xff1a; 某新能源行业公司是一家集研发、生产、销售新能源汽车于一体的综合性新能源企业。公司业务遍及全球多个国家和地区&#xff0c;拥有庞大的供应商网络和采购需求。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 客户痛点&#xf…

Unity中Shader面片一直面向摄像机

文章目录 前言一、实现思路1、 我们要实现模型面片一直跟着摄像机旋转&#xff0c;那么就需要用到旋转矩阵2、确定 原坐标系 和 目标坐标系3、确定旋转后坐标系基向量 二、确定旋转后 坐标系基向量 在 原坐标系 下的值1、Z轴基向量2、假设Y轴基向量 和 世界空间下 的Y轴方向一致…

科学的摇篮 - 贝尔实验室

AT&T贝尔实验室&#xff08;AT&T Bell Laboratories&#xff09;是美国电信公司AT&T的研究与开发部门&#xff0c;成立于1925年。它在20世纪的许多年里一直是科学与技术创新的重要中心&#xff0c;做出了众多重大贡献&#xff0c;并为多项科技成就奠定了基础。以下…

ReentrantLock底层原理学习二

以 ReentrantLock 作为切入点&#xff0c;来看看在这个场景中是如何使用 AQS 来实现线程的同步的 ReentrantLock 的时序图 调用 ReentrantLock 中的 lock()方法&#xff0c;源码的调用过程我使用了时序图来展现。ReentrantLock.lock() 这个是 reentrantLock 获取锁的入口 pu…

C++流媒体服务器 ZLMediaKit框架ZLToolKit源码解读

ZLMediaKit是国人开发的开源C流媒体服务器&#xff0c;同SRS一样是主流的流媒体服务器。 ZLToolKit是基于C11的高性能服务器框架&#xff0c;和ZLMediaKit是同一个作者&#xff0c;ZLMediaKit正是使用该框架开发的。 ZLMediaKit开源地址&#xff1a;https://github.com/ZLMedi…

SpringMVC-@RequestMapping注解

0. 多个方法对应同一个请求 RequestMapping("/")public String toIndex(){return "index";}RequestMapping("/")public String toIndex2(){return "index";}这种情况是不允许的&#xff0c;会报错。 1. 注解的功能 RequestMapping注…

C++面试宝典第15题:最长回文子串

题目 回文是一个正读和反读都相同的字符串,比如:"aba"是回文,而"abc"不是回文。现给定一个字符串s,找出s中最长的回文子串(可能有多个最长的,找出一个即可)。 示例 1: 输入: "babad" 输出: "bab"("aba" 也是一个有…

总420+,专业120+南京大学851信号与系统电子信息考研经验通信,电子信息

今年考研数学130&#xff0c;专业课120&#xff0c;总分420顺利被南京大学电通录取&#xff0c;梦圆南大&#xff0c;这一年的复习有过迷茫&#xff0c;有过犹豫&#xff0c;最后都坚持过来了&#xff0c;总结一下自己的复习经验&#xff0c;希望对大家有所帮助。数学 5-8月数…

MySQL-存储引擎

简介&#xff1a;存储引擎是存储数据&#xff0c;建立索引&#xff0c;更新/查询数据等技术的实现方式。存储引擎是基于表的&#xff0c;而不是基于库的&#xff0c; (同一个数据库的不同表可以选择不同的存储引擎) 所以存储引擎也可被称为表类型。 我们输入 SHOW CREATE TAB…

操作系统内存碎片

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com&#xff0c;github地址为https://github.com/jintongxu。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家访问。 一、前言 内存碎片是指无法被利用的内…
最新文章