19

I've setup a server with multiple docker containers, accessible with jwilders nginx reversre proxy. When you run the containers you can set the VIRTUAL_HOST environment variable. I've been trying to figure out a way of updating these after a container was launched.

A solution posted here :

You just stop docker daemon and change container config in

/var/lib/docker/containers/[container-id]/config.json

Requires you to stop the docker daemon, but I would prefer not to have to resort to that.

Another here, uses docker commit to preserve the instance information:

Having said that, you -can- preserve filesystem changes in the container, by committing it as a new image;

$ docker run -it --name=foobar alpine sh
$ docker commit foobar mynewimage
$ docker rm foobar
$ docker run -it --name=foobar mynewimage sh

Though this also seems to be a bit over the top for just changing an environment variable.

I've looked in docker update, but that is mainly for reconfiguring container resources.

Of course, if I have no other choice I will use either of the methods above, but I'm wondering if anyone has found some other solution?

jww
  • 97,681
  • 90
  • 411
  • 885
Victor.dMdB
  • 999
  • 2
  • 11
  • 29
  • I think it is better to update a Dockerfile, with some `ENV abc 123` or `ENV abc=123 def=456` and rebuild/relaunch – user2915097 Jul 26 '16 at 12:08
  • 1
    Possible duplicate of [How to set an environment variable in a running docker container](https://stackoverflow.com/q/27812548/608639) – jww Oct 16 '18 at 07:48
  • 1
    tldr the quick way https://stackoverflow.com/questions/27812548/how-to-set-an-environment-variable-in-a-running-docker-container/56965134#56965134 – Max Barrass Jul 11 '19 at 00:23

1 Answers1

25

Destroy your container and start a new one up with the new environment variable using docker run -e .... It's identical to changing an environment variable on a running process, you stop it and restart with a new value passed in. Replace the concept of restarting a process with destroying and recreating a new container.

If your container contains files that cannot be lost, then you should be using volumes. The other contents of the container filesystem should be either disposable or immutable.

BMitch
  • 231,797
  • 42
  • 475
  • 450
  • 1
    Well yes, true, one could default back to recreating the container, and I did in the end since I'm using a volume, but I was more curious if there was a way to do so as a kind of running patch? – Victor.dMdB Jul 30 '16 at 05:34
  • 8
    Docker doesn't provide a way to modify an environment variable in a running container because the OS doesn't provide a way to modify an environment variable in a running process. You need to destroy and recreate. – BMitch Jul 30 '16 at 11:55
  • @BMitch That doesn't make sense. You can stop and start containers. – Lamp Oct 23 '20 at 08:17
  • @Lamp the update command doesn't require that you restart the container to take effect. If you change something that requires a container restart, then the workflow is to replace the container instead. – BMitch Oct 23 '20 at 10:21