【Docker】Dockerfile ENV环境变量传递问题

ops/2025/1/11 13:49:33/

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、直接说结论
  • 二、怎么解决这个问题
    • 方案1. 不使用多级嵌套的变量
    • 方案2. 使用 bash 在启动时动态解析环境变量


前言

这两天在给生产环境部署skywalking链路监控,发现配置好agent之后无法连到服务端,经过排查发现是docker启动容器时环境变量传递没有传递给应用,导致配置不对!
特此记录修复过程!

Dockerfile:

# 基于 Alpine 镜像
FROM alpine:3.18.2# 安装 bash,便于环境变量传递和使用
RUN apk add --no-cache bash# 设置默认环境变量(可以被 -e 参数覆盖)
ENV MY_VAR=default_value
ENV MY_VAR2="insert var is ${MY_VAR}"# 打印 MY_VAR2 的值
CMD echo $MY_VAR2

构建&启动:

# 构建
docker build -t alpine-env-example .
# 启动
docker run -it -e MY_VAR=custom_value alpine-env-example

结果:环境变量并没有传递成功
在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、直接说结论

在 Dockerfile 中设置环境变量时,${MY_VAR}是在构建镜像时解析的,而不是在容器运行时解析的。因此,如果你在设置 【MY_VAR2】 的值时依赖于 ${MY_VAR},它会在镜像构建时解析并填充默认值。

具体原因如下:

ENV MY_VAR=default_value 会将 【MY_VAR】 设置为 default_value
然后,ENV MY_VAR2="insert var is ${MY_VAR}" 会在构建镜像时将 ${MY_VAR} 替换为 default_value,因为 【MY_VAR】 在构建时已经存在,所以 【MY_VAR2】 最终的值是 "insert var is default_value"

二、怎么解决这个问题

方案1. 不使用多级嵌套的变量

Dockerfile:

FROM alpine:3.18.2
RUN apk add --no-cache bash
# 这里只使用1个变量
ENV MY_VAR=default_value
#ENV MY_VAR2="insert var is ${MY_VAR}"CMD bash -c 'echo "insert var is $MY_VAR" && exec bash'

构建&启动:

# 构建
docker build -t alpine-env-example .
# 启动
docker run -it -e MY_VAR=custom_value alpine-env-example

结果如下:成功传递变量
在这里插入图片描述

方案2. 使用 bash 在启动时动态解析环境变量

Dockerfile:

FROM alpine:3.18.2
RUN apk add --no-cache bash
ENV MY_VAR=default_value
ENV MY_VAR2="insert var is ${MY_VAR}"# 使用 bash 在启动时动态解析环境变量
CMD bash -c 'export MY_VAR2="insert var is ${MY_VAR}" && echo $MY_VAR2 && exec bash'  

构建&启动:

# 构建
docker build -t alpine-env-example .
# 启动
docker run -it -e MY_VAR=custom_value alpine-env-example

结果如下:也能达到效果
在这里插入图片描述


http://www.ppmy.cn/ops/149175.html

相关文章

elasticsearch常见故障汇总

es的入库突然出现异常,大量超时 查看集群状态,状态为红色 GET _cluster/health 具体查看,实体,看看是那些索引状态异常,看到wb_info_2025-01-08索引状态异常 GET _cat/indices?v 注:其他上面的步骤可以在…

第四、五章图论和网络爬虫+网络搜索

第四章 图论和网络爬虫 4.1 构建网络爬虫工程重点 构建网络爬虫的重点 用BFS还是DFS 在不考虑时间的情况下,这两种不同的搜索方法都可以在相同的时间下爬下整个静态的互联网内容,但是在现实中肯定是需要考虑时间以及互联网动态变化的。所以重点应该是如…

linux nginx 安装后,发现SSL模块未安装,如何处理?

👨‍⚕ 主页: gis分享者 👨‍⚕ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕ 收录于专栏:运维工程师 文章目录 前言SSL模块安装 前言 nginx 安装后,发现SSL模块未安装&…

2025年新出炉的MySQL面试题

🎥 作者简介: CSDN\阿里云\腾讯云\华为云开发社区优质创作者,专注分享大数据、Python、数据库、人工智能等领域的优质内容 🌸个人主页: 长风清留杨的博客 🍃形式准则: 无论成就大小,…

稀土化合物:引领科技创新,推动绿色发展

一、稀土化合物的基本概念 稀土化合物是指由稀土元素与其他元素形成的化学化合物。稀土元素包括镧系元素和铕、铽、镱、钇等,具有独特的物理、化学性质,这些元素在现代工业、科技和环保领域中扮演着至关重要的角色。稀土化合物具有非常丰富的光、电、磁…

风力发电新技术进展:开启绿色能源新篇章

摘要 本文深入探讨风力发电领域的新技术发展。风机大型化与高效化趋势显著,单机容量不断攀升,叶片与塔筒技术持续革新;控制技术智能化升级,实现精准运行与故障的提前预判;海上风电技术取得关键突破,浮式基础…

基于单片机的直流稳压电源的设计(论文+源码)

1.系统方案设计 在本次直流稳压电源的设计中,其关键指标如下: 系统输入电压220V交流系统输出直流0到12V可调,步进可以达到0.1V电流最大输出可以到2A具有短路保护功能可以通过液晶或者数码管等显示设备显示当前输出电压 2. 电路图

HCIE-day11-BGP1

BGP AS之间为EGP协议,AS之内IGP协议。通常在IGP之间完成路由计算;BGP完成路由的转发控制,选择最佳路由。BGP使用TCP作为传输层协议(端口号179),提高了协议的可靠性。支持无类别域间路由CIDR(A …