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

9

У меня есть Docker-контейнер, работающий с systemd . Я хочу передать переменные среды приложениям под ним.

Когда я запускаю systemd из Docker (в /sbin/initвиде командной строки), Docker предоставляет переменные для systemd, но не предоставляет дочерним службам . Если я добавлю systemd.setenv=...в cmdline, переменные будут переданы. Я ищу более чистое решение.

Как открыть переменные среды, переданные /sbin/initв приложения, запущенные им?

% docker run -v /sys/fs/cgroup:/sys/fs/cgroup:ro --privileged -ti \
             -e VAR1=1 motiejus/systemd_fedora20 \
             init systemd.setenv=VAR2=2
...
Welcome to Fedora 20 (Heisenbug)!
...
[  OK  ] Reached target Multi-User System.
[root@740690365eb0 ~]# env | grep VAR
VAR2=2

Я ожидаю увидеть VAR1=1во время выполнения моей команды.

Другими словами, может ли systemd передавать переменные, передаваемые ему, детям, которые он запускает?

Для Dockerfile смотрите репозиторий github .

Мотеюс Якштис
источник

Ответы:

9

Чтобы ответить на заданный вопрос (так как на него, похоже, больше нет ответа)

«Как мне выставить переменные среды, переданные в / sbin / init, приложениям, запущенным им?»

требуется немного раздражающий bash и чрезвычайно полезная функция файловой системы linux / proc:

# Import our environment variables from systemd
for e in $(tr "\000" "\n" < /proc/1/environ); do
        eval "export $e"
done

Это читает / proc / 1 / envion, который является средой, заданной для PID 1, но ограничен нулями. Он использует «tr» для замены нулей новыми строками, а затем перебирает эти строки и обнуляет их с помощью предварительно добавленного «экспорта», чтобы они были видны дочерним процессам.

Неэкспонирующие переменные среды - еще одна «особенность» systemd, и они не считают это ошибкой.

xrobau
источник
3
Я хочу сказать: «Мне не нужна эта функция, мне нужны переменные окружения»
Даниэль Дай
2

Согласно этому описанию, пользовательский экземпляр systemd не наследует переменные среды:

https://wiki.archlinux.org/index.php/Systemd/User#Environment_variables

Здесь предлагается использовать службу onehot systemd, которая настраивает EnvironmentFile для «конечной» службы.

/programming/25396167/how-do-i-get-etcd-values-into-my-systemd-service-on-coreos

janosi
источник
1
Также рассмотрите, чтобы проверить PassEnvironment=. Это помогло мне в среде docker systemd.
FelikZ