如何在正在运行的docker容器中设置环境变量

时间:2015-01-07 04:46:43

标签: docker

如果我有一个我开始使用的docker容器,那么在该运行容器中设置环境变量的最佳方法是什么?我在运行run命令时最初设置了一个环境变量。

$ docker run --name my-wordpress -e VIRTUAL_HOST=domain.com --link my-mysql:mysql -d spencercooley/wordpress

但是现在它已经运行了一段时间我想在环境变量中添加另一个VIRTUAL_HOST。我不想删除容器,然后只使用我想要的环境变量重新运行它,因为那时我必须将旧卷迁移到新容器,它有主题文件和上传,我不想要输。

我只想更改VIRTUAL_HOST环境变量的值。

13 个答案:

答案 0 :(得分:31)

通常有两种选择,因为docker现在不支持此功能:

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

    #!/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"
    

答案 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)

要:

  1. 设置了许多环境。 vars一步到位,
  2. 防止在'sh'历史中暴露它们,例如'-e'选项(传递凭证/ api令牌!),
  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

保存要编辑的容器的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无效,我不得不先停止然后再使用两个单独的命令启动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容器配置的方法

  1. 停止容器:docker stop <container name>
  2. 编辑容器配置: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>)
  3. 重新启动docker

答案 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)

快速工作的黑客将是:

  1. 进入正在运行的容器。 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=",")

  2. set env variable, 如果没有安装在容器中,请安装 vim

docker exec -it <container_name> bash

apt-get install vim 在文件末尾添加 vi ~/.profile

export MAPPING_FILENAME=p_07302021 检查是否已设置! source ~/.profile(确保您应该从容器中出来。)

  1. 现在,您可以从容器内部运行在容器外部运行的任何内容。 请注意,如果您担心当前登录的会话被注销,您的工作可能会丢失。您始终可以在开始第 1 步之前使用 screen。这样,如果您因内部正在运行的容器会话而注销,您可以重新登录。

答案 12 :(得分:-4)

使用export VAR=Value

然后在终端中键入printenv以验证其设置正确。