如何在运行的Docker容器中设置环境variables
如果我有一个docker容器,我开始回来,什么是在运行的容器中设置一个环境variables的最佳方式是什么? 我在运行run命令时最初设置了一个环境variables。
$ docker run --name my-wordpress -e VIRTUAL_HOST=domain.com --link my-mysql:mysql -d spencercooley/wordpress
但现在它已经运行了一段时间,我想添加另一个VIRTUAL_HOST
环境variables。 我不想删除容器,然后重新运行它与我想要的环境variables,因为那么我将不得不将旧卷迁移到新的容器,它有主题文件,并在其中上传,我不想失去。
我只想改变VIRTUAL_HOST
环境variables的值。
一般有两种select,因为docker现在不支持这个function:
-
创build你自己的脚本,它将像你的命令一样运行。 例如:
#!/bin/bash export VAR1=VAL1 export VAR2=VAL2 your_cmd
-
按以下方式运行您的命令:
docker exec -i CONTAINER_ID /bin/bash -c "export VAR1=VAL1 && export VAR2=VAL2 && your_cmd"
Docker不提供这个function。
有一个问题:“ 如何在现有的容器上设置环境variables?#8838 ”
另外从“ 允许docker start
采取环境variables#7561 ”:
现在,Docker无法在创build容器时更改容器的configuration,通常这是可以的,因为创build新容器是微不足道的。
对于一个稍微狭窄的用例, docker问题8838提到了这种黑客行为:
您只需停止docker守护进程并更改/var/lib/docker/containers/[container-id]/config.json(sic)中的容器configuration
此解决scheme更新环境variables,无需删除和重新运行容器,不得不迁移卷并记住要run
参数。
但是,这需要重新启动docker守护进程。 而且,在解决问题2658之前,这包括重新启动所有容器 。
你写道,你不想迁移旧的卷 。 因此,我假设您用来构buildspencercooley/wordpress
图像的spencercooley/wordpress
已经定义了VOLUME
或者您使用-v
开关在命令行上指定了它们。
您可以简单地启动一个新容器,使用--volumes-from
开关从旧容器导入容器,如:
$ docker run --name my-new-wordpress --volumes-from my-wordpress -e VIRTUAL_HOST=domain.com --link my-mysql:mysql -d spencercooley/wordpres
所以你将有一个新的容器,但你不会丢失旧的数据。 您甚至不需要触摸或移动它 。
一个干得好的容器永远是无状态的 。 这意味着它的过程应该只添加或修改定义卷上的文件。 在容器运行一段时间后,可以通过一个简单的docker diff <containerId>
来validation。
在这种情况下,当你用相同的参数重新创build容器(在你的情况稍微修改的情况下)是不危险的。 假设您从完全相同的旧图像创build的图像创build它,并重新使用与上述开关相同的卷。
新的容器启动成功后,你确认一切正常运行,你可以删除旧的WordPress的容器。 旧卷随后从新容器中引用,不会被删除。
首先,您可以像在Linux机器上一样设置env。
其次,可以通过修改docker容器的configuration文件( /var/lib/docker/containers/xxxx/config.v2.json
)来完成。 请注意,您需要重新启动Docker服务才能生效。 这样你可以改变一些其他的东西,如端口映射等
只需附加到它并导出variables:
docker attach <container_id> export VIRTUAL_HOST=domain.com