Не сохраняются переменные в докер контейнере. Почему?

Допустим я захожу в работающий докер-контейнер в котором переменная $NUMBER=one будучи определена через docker-compose env-файлом.

docker exec -it <идентификатор контейнера> /bin/sh

и внутри контейнера, в консоли переопределяю ее значение либо через прокинутый уже внутрь контейнера file.env командой

source file.env 

либо через export на $NUMBER=two,либо еще как-то: не суть. Если я внутри контейнера после этого выведу echo $NUMBER , то получу two.

А вот если я выйду из контейнера CTRL+D и снова в него войду при помощи той же команды

docker exec -it <идентификатор контейнера> /bin/sh

то получу в консоли по echo $NUMBER ответ "one". Почему так происходит, ведь контейнер я не останавливал?


Ответы (1 шт):

Автор решения: Hellseher

Это ни как не связано с программой docker. Это больше относится к устройству *nix подобных систем.

Если вам нужно "сохранить" переменную окружения для последующих сессий, то в файле настройки вашей оболочки (bash, sh, zsh, fish, csh, dash и тд) нужно указать:

вариант для bash

$HOME/.bashrc или $HOME/.bash_history

...
export $NUMBER=one
...

Но контейнерный подход предполагает передавать все переменные окружения во время старта

docker run --file Dockerfile --env "VAR=val" --env "VAR1=val1" <image-name>:<tag-name> .

или определить все переменные в файле и передать во время старта

docker run --name <container-name> --file path/to/Dockerfile --env-file  <image-name>:<tag-name> .

Как я понимаю идею контейнеров - это сиюминутная изоляция окружения, которая предопределена во время старта, если нужна манипуляция с переменными окружения, ручная настройка (Ansible, Puppet, Chef и тд) установка пакетов, предсказуемая перезагрузка то смотрите в сторону полноценных виртуальных машин - VirtualBox, KVM/Qemu, Xen и тд. Или разворачивайте все локально на боевом сервере под GNU/Linux или *BSD.

→ Ссылка