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

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

文章目录


前言

这两天在给生产环境部署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

结果如下:也能达到效果

相关推荐
隔振消音专家2 分钟前
冷水机组振动传导影响及专业化减振适配治理方案
大数据·运维
Brilliantwxx4 分钟前
【Linux】 软件包管理器(yum)+ Vim使用
linux·运维·服务器·开发语言·编辑器·vim
skywalk81638 分钟前
在FreeBSD的Uubntu兼容环境下安装Reasonix
linux·运维·freebsd
^yi23 分钟前
【Linux系统编程】对操作系统的理解
linux·运维·服务器·操作系统·系统调用·os
Kina_C39 分钟前
LVS-NAT 负载均衡实验从环境搭建到规则持久化
linux·运维·服务器·负载均衡·lvs
Android洋芋1 小时前
PrintFriendly网页文章转PDF插件工具及技术分析
运维·服务器·pdf·网页转pdf
Elastic 中国社区官方博客1 小时前
使用重新设计的 AutoOps 更快地进行 Elasticsearch 问题排查
大数据·运维·前端·人工智能·elasticsearch·搜索引擎·全文检索
RoboWizard1 小时前
金士顿高速闪存盘 单双接口适配多元存储需求
大数据·运维·人工智能·智能手机·云计算
hkj88081 小时前
Ubuntu 20.04 安装 OpenJDK 17
linux·运维·ubuntu
sulikey2 小时前
服务器安装Docker教程。如何在云服务器安装Docker容器?
运维·服务器·ubuntu·docker·安装教程·云服务器