如何在运行的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:

  1. 创build你自己的脚本,它将像你的命令一样运行。 例如:

     #!/bin/bash export VAR1=VAL1 export VAR2=VAL2 your_cmd 
  2. 按以下方式运行您的命令:

     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