如何在运行docker容器时覆盖环境变量

Vij*_*rge 1 docker

我试图了解在运行的 docker 容器内覆盖环境变量的方法。

我按照其他 SO 帖子的建议尝试了以下选项。每次我通过docker exec -e它设置环境变量时,它都会显示设置的环境变量。在下一次运行时它就会消失。

启动docker的命令:

docker run -itd --rm -e VAR1=test_var1 -e VAR2=test_var2  --name "test" phusion/baseimage:18.04-1.0.0
Run Code Online (Sandbox Code Playgroud)

运行 docker exec 设置环境变量

cloud_user@vijaygharge1c:/var/lib/docker$ docker exec -it -e VAR4=test_var4 test env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=de9cf4253ae9
TERM=xterm
VAR1=test_var1
VAR2=test_var2
DEBIAN_FRONTEND=teletype
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_ALL=en_US.UTF-8
VAR4=test_var4
HOME=/root
cloud_user@vijaygharge1c:/var/lib/docker$ docker exec -it -e VAR4=test_var4 test env | grep VAR
VAR1=test_var1
VAR2=test_var2
VAR4=test_var4
cloud_user@vijaygharge1c:/var/lib/docker$ docker exec -it -e VAR3=test_var3 test env | grep VAR
VAR1=test_var1
VAR2=test_var2
VAR3=test_var3
cloud_user@vijaygharge1c:/var/lib/docker$ 
Run Code Online (Sandbox Code Playgroud)

码头工人版本:

cloud_user@vijaygharge1c:/var/lib/docker$ docker -v
Docker version 19.03.12, build 48a66213fe
cloud_user@vijaygharge1c:/var/lib/docker$ 
Run Code Online (Sandbox Code Playgroud)

Dav*_*aze 6

您必须删除并重新创建容器。还有许多其他 Docker 选项(卷安装、网络配置、正在运行的实际映像)在创建容器后也无法更改;删除和重新创建容器是非常例行公事的,这是您需要执行此操作的地方。

\n

具体就环境变量而言,进程的环境是在最初创建时设置的(更正确的是,当其前任execve (2) it 时),之后进程可以setenv (3) 其自己的环境,但没有其他方法可以更改它\ xe2\x80\x93 不是它的父级,不是它的子级,没有 root 权限。这是一般的 Unix 声明,并非特定于 Docker。

\n

在 Docker 中,还有其他一些环境变化不可见的地方。容器中的进程可以更改其自身的环境(通常在入口点脚本中执行此操作),但这在docker inspect输出或docker execshell 中不可见。在您的示例中,您是docker exec现有容器内的新 shell 并更改该 shell 的环境,但这不会更改主容器进程的环境,也不会更改输出docker inspect

\n