Подтвердить что ты не робот

Как установить переменную среды в запущенном контейнере докеров

Если у меня есть контейнер докеров, который я начал некоторое время назад, что лучший способ установить переменную среды в этом запущенном контейнере? Первоначально я задал переменную среды, когда я запустил команду run.

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

но теперь, когда он работает некоторое время, я хочу добавить другую переменную VIRTUAL_HOST в переменную среды. Я не хочу удалять контейнер, а затем просто повторно запускаю его с переменной среды, которую хочу, потому что тогда мне пришлось бы переносить старые тома в новый контейнер, у него есть файлы тем и загружать в него, что я не хочу проиграть.

Я бы просто хотел изменить значение переменной среды VIRTUAL_HOST.

4b9b3361

Ответ 1

Существует два общих варианта, поскольку докер не поддерживает эту функцию сейчас:

  • Создайте свой собственный script, который будет действовать как бегун для вашей команды. Например:

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

Ответ 2

Docker не предлагает эту функцию.

Возникла проблема: " Как установить переменную окружения в существующем контейнере? # 8838"

Также из " Разрешить docker start принимать переменные среды # 7561":

Теперь Docker не может изменить конфигурацию контейнера после его создания, и обычно это нормально, потому что для создания нового контейнера тривиально.

Ответ 3

Для несколько узкого варианта использования докер-выпуск 8838 упоминает этот тип хака:

Вы просто останавливаете демон docker и изменяете конфигурацию контейнера в /var/lib/docker/containers/[container-id]/config.json(sic)

Это решение обновляет переменные среды без необходимости удалять и перезапускать контейнер, выполнять миграцию томов и запоминать параметры для run.

Однако для этого требуется перезапустить демон Docker. И до тех пор, пока проблема 2658 не будет решена, это включает перезапуск всех контейнеров.

Ответ 4

Вы написали, что не хотите переносить старые тома. Поэтому я предполагаю, что либо 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

Во-первых, вы можете установить env внутри контейнера так же, как и в поле linux.

Во-вторых, вы можете сделать это, изменив конфигурационный файл вашего контейнера докеров (/var/lib/docker/containers/xxxx/config.v2.json). Обратите внимание, что вам необходимо перезагрузить службу докеров, чтобы повлиять на нее. Таким образом вы можете изменить некоторые другие вещи, такие как сопоставление портов и т.д.

Ответ 6

Для того, чтобы:

  1. установить много env. вари в один шаг,
  2. не показывать их в истории 'sh', как с опцией '-e' (передача учетных данных/токенов API!),

ты можешь использовать

- -e nv файл key_value_file.txt

опция:

docker run --env-file key_value_file.txt $INSTANCE_ID

Ответ 7

Вы можете установить переменную окружения для работающего контейнера Docker:

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

Проверьте это с помощью команды ниже

printenv

Это обновит ваш ключ с новым предоставленным значением.

Примечание: это будет возвращено к старому при перезапуске докера.

Ответ 8

вот как постоянно обновлять конфигурацию 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. перезапустить докер

Ответ 9

Если вы запускаете контейнер как service, используя docker swarm, вы можете сделать:

docker service update --env-add <you environment variable> <service_name>

Также удалите, используя --env-rm

Чтобы убедиться, что он добавлен, как вы хотели, просто запустите: docker exec -it <container id> env

Ответ 10

Просто присоедините к нему и экспортируйте переменную:

docker attach <container_id>
export VIRTUAL_HOST=domain.com