如何为运行中Docker容器内不同用户动态配置不同的环境变量值
实现方案
问题根因
- Docker通过
environment字段注入的是容器全局的初始环境变量,仅对容器1号进程(默认root身份启动)的上下文生效,su -切换用户时会重置环境变量,读取用户自身的shell配置文件,不会继承root的环境变量 - 你之前执行的赋值命令逻辑错误:
su - user1会启动独立子shell,后续的source、export操作均在root上下文执行,未写入user1的运行环境
推荐方案(支持运行时动态修改,无需重建镜像)
步骤1:修改Dockerfile补充变量加载逻辑(仅需修改一次)
在Dockerfile末尾增加以下配置,给所有用户的登录shell增加自定义环境变量的加载入口:
# 创建用户级环境变量的统一存储目录 RUN mkdir -p /etc/user_env && chmod 755 /etc/user_env # 给root、user1、user2的bash配置文件增加加载规则 RUN for user in root user1 user2; do \ echo "source /etc/user_env/\$USER.env" >> /home/$user/.bash_profile; \ # 适配非登录shell场景 echo "source /etc/user_env/\$USER.env" >> /home/$user/.bashrc; \ done
重新构建镜像即可,后续无需再修改镜像内容。
步骤2:调整docker-compose.yml配置
首先修正你现有配置的两处拼写错误:enviromnet改为environment,entrypoint中/bin/sh/的多余斜杠去掉。
按用户维度注入初始环境变量:
version: '3' services: app1: image: image1 environment: - USER1_ENV_VAL=34052 - USER2_ENV_VAL=34034 # 其他用户的默认值可自定义 entrypoint: /bin/sh start_container.sh app2: image: image1 environment: - USER1_ENV_VAL=34034 - USER2_ENV_VAL=34028 entrypoint: /bin/sh start_container.sh
步骤3:修改启动脚本start_container.sh
容器启动时自动生成每个用户的专属环境变量文件:
#!/bin/sh # 生成user1专属环境变量文件 echo "export env_val=$USER1_ENV_VAL" > /etc/user_env/user1.env chown user1:user1 /etc/user_env/user1.env chmod 600 /etc/user_env/user1.env # 生成user2专属环境变量文件 echo "export env_val=$USER2_ENV_VAL" > /etc/user_env/user2.env chown user2:user2 /etc/user_env/user2.env chmod 600 /etc/user_env/user2.env # 原有容器启动逻辑放在下方 # ...
动态修改变量的方法
无需重启容器,执行以下命令即可更新对应用户的env_val,新登录的用户会话会自动加载新值,已登录的会话执行source ~/.bashrc即可立即生效:
# 修改user1的env_val为新值 docker exec container_name /bin/bash -c 'echo "export env_val=新值" > /etc/user_env/user1.env'
临时会话方案(无需修改镜像/配置)
如果仅需要单次执行命令时指定用户的环境变量,可直接在docker exec时指定用户和对应变量,仅对当前会话生效:
docker exec -it -u user1 -e env_val=34052 container_name bash
内容的提问来源于stack exchange,提问作者dincer.unal
相关产品推荐
相关产品推荐

