How to set an environment variable in a running docker container

前端 未结 11 1137
难免孤独
难免孤独 2020-11-29 23:28

If I have a docker container that I started a while back, what is the best way to set an environment variable in that running container? I set an environment variable initia

相关标签:
11条回答
  • 2020-11-30 00:02

    For a somewhat narrow use case, docker issue 8838 mentions this sort-of-hack:

    You just stop docker daemon and change container config in /var/lib/docker/containers/[container-id]/config.json (sic)

    This solution updates the environment variables without the need to delete and re-run the container, having to migrate volumes and remembering parameters to run.

    However, this requires a restart of the docker daemon. And, until issue issue 2658 is addressed, this includes a restart of all containers.

    0 讨论(0)
  • 2020-11-30 00:02

    Firstly you can set env inside the container the same way as you do on a linux box.

    Secondly, you can do it by modifying the config file of your docker container (/var/lib/docker/containers/xxxx/config.v2.json). Note you need restart docker service to take affect. This way you can change some other things like port mapping etc.

    0 讨论(0)
  • 2020-11-30 00:02

    Here's how you can modify a running container to update its environment variables. This assumes you're running on Linux. I tested it with Docker 19.03.8

    Live Restore

    First, ensure that your Docker daemon is set to leave containers running when it's shut down. Edit your /etc/docker/daemon.json, and add "live-restore": true as a top-level key.

    sudo vim /etc/docker/daemon.json
    

    My file looks like this:

    {
        "default-runtime": "nvidia",
        "runtimes": {
            "nvidia": {
                "path": "nvidia-container-runtime",
                "runtimeArgs": []
            }
        },
        "live-restore": true
    }
    

    Taken from here.

    Get the Container ID

    Save the ID of the container you want to edit for easier access to the files.

    export CONTAINER_ID=`docker inspect --format="{{.Id}}" <YOUR CONTAINER NAME>`
    

    Edit Container Configuration

    Edit the configuration file, go to the "Env" section, and add your key.

    sudo vim /var/lib/docker/containers/$CONTAINER_ID/config.v2.json
    

    My file looks like this:

    ...,"Env":["TEST=1",...
    

    Stop and Start Docker

    I found that restarting Docker didn't work, I had to stop and then start Docker with two separate commands.

    sudo systemctl stop docker
    sudo systemctl start docker
    

    Because of live-restore, your containers should stay up.

    Verify That It Worked

    docker exec <YOUR CONTAINER NAME> bash -c 'echo $TEST'
    

    Single quotes are important here.

    You can also verify that the uptime of your container hasn't changed:

    docker ps
    
    0 讨论(0)
  • 2020-11-30 00:05

    You could set an environment variable to a running Docker container by

    docker exec -it -e "your environment Key"="your new value" <container> /bin/bash

    Verify it using below command

    printenv

    This will update your key with the new value provided.

    Note: This will get reverted back to old on if docker gets restarted.

    0 讨论(0)
  • 2020-11-30 00:07

    To:

    1. set up many env. vars in one step,
    2. prevent exposing them in 'sh' history, like with '-e' option (passing credentials/api tokens!),

    you can use

    --env-file key_value_file.txt

    option:

    docker run --env-file key_value_file.txt $INSTANCE_ID
    
    0 讨论(0)
  • 2020-11-30 00:10

    You wrote that you do not want to migrate the old volumes. So I assume either the Dockerfile that you used to build the spencercooley/wordpress image has VOLUMEs defined or you specified them on command line with the -v switch.

    You could simply start a new container which imports the volumes from the old one with the --volumes-from switch like:

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

    So you will have a fresh container but you do not loose the old data. You do not even need to touch or migrate it.

    A well-done container is always stateless. That means its process is supposed to add or modify only files on defined volumes. That can be verified with a simple docker diff <containerId> after the container ran a while.

    In that case it is not dangerous when you re-create the container with the same parameters (in your case slightly modified ones). Assuming you create it from exactly the same image from which the old one was created and you re-use the same volumes with the above mentioned switch.

    After the new container has started successfully and you verified that everything runs correctly you can delete the old wordpress container. The old volumes are then referred from the new container and will not be deleted.

    0 讨论(0)
提交回复
热议问题