如果我有一个我开始使用的docker容器,那么在该运行容器中设置环境变量的最佳方法是什么?我在运行run命令时最初设置了一个环境变量。
$ docker run --name my-wordpress -e VIRTUAL_HOST=domain.com --link my-mysql:mysql -d spencercooley/wordpress
但是现在它已经运行了一段时间我想在环境变量中添加另一个VIRTUAL_HOST
。我不想删除容器,然后只使用我想要的环境变量重新运行它,因为那时我必须将旧卷迁移到新容器,它有主题文件和上传,我不想要输。
我只想更改VIRTUAL_HOST
环境变量的值。
答案 0 :(得分:31)
通常有两种选择,因为docker现在不支持此功能:
创建您自己的脚本,它将像您的命令一样运行。例如:
#!/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"
答案 1 :(得分:15)
Docker不提供此功能。
有一个问题:“How to set an enviroment variable on an existing container? #8838”
同样来自“Allow docker start
to take environment variables #7561”:
现在Docker无法在创建容器后更改容器的配置,通常这没关系,因为创建新容器很简单。
答案 2 :(得分:7)
对于一个有点狭窄的用例,docker issue 8838提到了这种黑客攻击:
您只需停止docker守护程序并在/var/lib/docker/containers/[container-id]/config.json(原文如此)中更改容器配置
此解决方案更新环境变量,无需删除和重新运行容器,必须迁移卷并记住参数run
。
但是,这需要重新启动docker守护程序。并且,在解决问题issue 2658之前,这包括重新启动所有容器。
答案 3 :(得分:4)
首先,您可以像在Linux机箱上一样在容器内设置env。
其次,您可以通过修改docker容器(print(b)
)的配置文件来实现。请注意,您需要重新启动docker服务才能生效。这样你就可以改变其他一些东西,如端口映射等。
答案 4 :(得分:3)
您写道,您不希望迁移旧卷。因此,我假设您用于构建Dockerfile
图像的spencercooley/wordpress
已定义VOLUME
,或者您在命令行上使用-v
开关指定了它们。
您可以简单地启动一个新容器,该容器使用--volumes-from
switch从旧容器导入卷,如:
$ 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>
验证这一点。
在这种情况下,当您使用相同的参数重新创建容器时(在您的情况下略微修改的容器),它并不危险。假设您从创建旧图像的完全相同的图像创建它,并使用上述开关重新使用相同的卷。
新容器成功启动并验证一切正常后,您可以删除旧的wordpress容器。然后,旧卷将从新容器中引用,不会被删除。
答案 5 :(得分:3)
要:
你可以使用
- env-file key_value_file.txt
选项:
docker run --env-file key_value_file.txt $INSTANCE_ID
答案 6 :(得分:2)
在这里,您可以修改运行中的容器以更新其环境变量。假设您正在Linux上运行。我用Docker 19.03.8进行了测试
首先,确保将Docker守护进程设置为在容器关闭时使其保持运行状态。编辑您的/etc/docker/daemon.json
,然后将"live-restore": true
添加为顶级密钥。
sudo vim /etc/docker/daemon.json
我的文件如下:
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
},
"live-restore": true
}
取自here。
保存要编辑的容器的ID,以便更轻松地访问文件。
export CONTAINER_ID=`docker inspect --format="{{.Id}}" <YOUR CONTAINER NAME>`
编辑配置文件,转到“环境”部分,然后添加密钥。
sudo vim /var/lib/docker/containers/$CONTAINER_ID/config.v2.json
我的文件如下:
...,"Env":["TEST=1",...
我发现重新启动Docker无效,我不得不先停止然后再使用两个单独的命令启动Docker。
sudo systemctl stop docker
sudo systemctl start docker
由于live-restore
,您的容器应该保持不动。
docker exec <YOUR CONTAINER NAME> bash -c 'echo $TEST'
这里的单引号很重要。
您还可以验证容器的正常运行时间没有改变:
docker ps
答案 7 :(得分:1)
如果您使用service
作为docker swarm
来运行容器,则可以执行以下操作:
docker service update --env-add <you environment variable> <service_name>
也可以使用--env-rm
要确保已按需添加它,只需运行:
docker exec -it <container id> env
答案 8 :(得分:0)
您可以通过以下方式将环境变量设置为正在运行的Docker容器
docker exec -it -e "your environment Key"="your new value" <container> /bin/bash
使用以下命令进行验证
printenv
这将使用提供的新值来更新您的密钥。
注意:如果重新启动docker,它将恢复为旧版本。
答案 9 :(得分:0)
这是永久更新docker容器配置的方法
docker stop <container name>
docker run -it -v /var/lib/docker:/var/lib/docker alpine vi $(docker inspect --format='/var/lib/docker/containers/{{.Id}}/config.v2.json' <container name>)
答案 10 :(得分:0)
在基本容器中进行一些修改之后,我用 docker commit 解决了这个问题,我们只需要标记新映像并开始创建新映像
docs.docker.com/engine/reference/commandline/commit
docker commit [container-id] [tag]
docker commit b0e71de98cb9堆栈溢出:0.0.1
然后您可以传递环境变量或文件
docker run --env AWS_ACCESS_KEY_ID --env AWS_SECRET_ACCESS_KEY --env AWS_SESSION_TOKEN --env文件env.local -p 8093:8093堆栈溢出:0.0.1
答案 11 :(得分:0)
快速工作的黑客将是:
进入正在运行的容器。
output = [[1.8238497e+03 5.2642276e-06]
[2.7092224e+03 6.7980350e-06]
[2.3406370e+03 6.6842499e-06]
...
[1.7234612e+03 6.6842499e-06]
[2.1071147e+03 2.1332115e-05]
[2.6937273e+03 6.2854801e-06]]
## write the outpout in csv at s3
s3 = s3fs.S3FileSystem(anon=False)
with s3.open(f"{'s3://bucket'}/result.csv",'w') as f:
numpy.savetxt(f, output, delimiter=",")
set env variable, 如果没有安装在容器中,请安装 vim
docker exec -it <container_name> bash
apt-get install vim
在文件末尾添加 vi ~/.profile
export MAPPING_FILENAME=p_07302021
检查是否已设置! source ~/.profile
(确保您应该从容器中出来。)
答案 12 :(得分:-4)
使用export VAR=Value
然后在终端中键入printenv
以验证其设置正确。