如何在正在运行的Docker容器中覆盖环境变量

时间:2020-08-08 09:49:14

标签: docker

我正在尝试了解在正在运行的Docker容器中覆盖环境变量的方法。

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

启动docker的命令:

docker run -itd --rm -e VAR1=test_var1 -e VAR2=test_var2  --name "test" phusion/baseimage:18.04-1.0.0

运行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$ 

Docker版本:

cloud_user@vijaygharge1c:/var/lib/docker$ docker -v
Docker version 19.03.12, build 48a66213fe
cloud_user@vijaygharge1c:/var/lib/docker$ 

3 个答案:

答案 0 :(得分:2)

您必须删除并重新创建容器。创建容器后,无法更改许多其他Docker选项(卷装载,网络配置,正在运行的实际映像)。删除和重新创建容器是非常常规的,这是您需要执行的操作。

具体而言,根据环境变量,在最初创建进程时会设置环境(更正确的是,在其前任执行 execute (2)时),然后该进程可以 setenv (3)自己的环境,但没有其他可以更改它的环境-不能更改其父级,不能更改其子级,也不能未经root许可。这是一般的Unix语句,并不特定于Docker。

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

答案 1 :(得分:0)

Environment变量在docker容器的运行时范围内。 这意味着,当您启动容器时,它将是您在开始时设置的变量。

容器不是持久性的,这意味着当您在容器中启动图像时,它是从头开始创建的,关于上一次运行没有内存。

根据您要实现的目标,您需要另一个解决方案。

答案 2 :(得分:0)

将环境变量视为容器中运行的应用程序内存在的其他变量。这样的变量的最后一个值会在Docker运行期间持续存在吗? -不。

如果要跨会话保存修改后的环境变量,则必须在退出容器之前将卷用作持久性存储,并将环境变量作为文件存储到该卷中。

如何创建和使用卷:

$ docker volume create my-vol

$ docker run -itd --rm  --name "test" phusion/baseimage:18.04-1.0.0 --mount source=myvol,target=/app

剩下的就是您的应用程序的责任,可以通过FS访问该卷并在其中保存环境变量。另外,您的应用程序的责任是在启动时访问该卷并还原最后的环境变量值。