проблемы с доступом к переменным окружения docker в служебных файлах systemd - PullRequest
0 голосов
/ 29 сентября 2018

1) Я запускаю Docker-контейнер со следующим cmd (передаю несколько переменных env с опцией -e)

$ docker run --name=xyz -d -e CONTAINER_NAME=xyz -e SSH_PORT=22 -e NWMODE=HOST -e XDG_RUNTIME_DIR=/run/user/0 --net=host -v /mnt:/mnt -v /dev:/dev -v /etc/sysconfig/network-scripts:/etc/sysconfig/network-scripts -v /:/hostroot/ -v /etc/hostname:/etc/host_hostname -v /etc/localtime:/etc/localtime -v /var/run/docker.sock:/var/run/docker.sock --privileged=true cf3681e04bfb

2) После запуска контейнера, как указано выше, я проверяюпеременная env NWMODE внутри контейнера, и она отображается правильно, как показано ниже:

$ docker exec -it xyz bash $ env | grep NWMODE NWMODE=HOST

3) Теперь я создал показанный ниже пример службы 'b', которая выполняет скрипт b.sh (где я пытаюсь получить доступ к NWMODE):

root@ubuntu16:/etc/systemd/system# cat b.service
[Unit]
Description=testing service b

[Service]
ExecStart=/bin/bash /etc/systemd/system/b.sh

root@ubuntu16:/etc/systemd/system# cat b.sh
#!/bin/bash`
systemctl import-environment
echo "NWMODE:" $NWMODE`

4) Теперь, если я запускаю службу 'b' и вижу ее журналы, это показывает, что она не может получить доступ к переменной env NWMODE

$ systemctl start b
$ journalctl -fu b
...
systemd[1]: Started testing service b.
bash[641]: NWMODE:      //blank for $NWMODE here`

5) Теперь вместо 'systemctl import-environment' в b.sh, если я делаю следующее, журналы b.service показывают правильное значение переменной enw NWMODE: $ systemctl import-environment $ systemctl start b

Хотя вышеприведенный шаг 5 работает, я не могу пойти на это, так как все службы в моей системе будут автоматически запускаться systemd.В таком случае, может кто-нибудь, пожалуйста, дайте мне знать, как я могу получить доступ к переменным окружения (переданным с помощью команды «docker run ...» выше) в служебном файле (скажем, например, в b.sh выше).Можно ли это как-то добиться с помощью systemctl import-environment или есть какой-то другой способ?

1 Ответ

0 голосов
/ 30 сентября 2018

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

Обход проблемы: создайте файл /etc/systemd/system.conf.d/myenvironment.conf:

[Manager]
DefaultEnvironment=CONTAINER_NAME=xyz NWMODE=HOST XDG_RUNTIME_DIR=/run/user/0

systemd установит переменные среды, объявленные в этом файле.

Вы можете настроить ENTRYPOINT скрипт, который автоматически создает этот файл перед запуском systemd.Пример:

RUN echo '#! /bin/bash \n\
echo "[Manager] \n\
DefaultEnvironment=$(while read -r Line; do echo -n "$Line" ; done < <(env) \n\
" >/etc/systemd/system.conf.d/myenvironment.conf \n\
exec /lib/systemd/systemd \n\
' >/usr/local/bin/setmyenv && chmod +x /usr/bin/setmyenv

ENTRYPOINT /usr/bin/setmyenv

Вместо создания скрипта в Dockerfile вы можете сохранить его снаружи и добавить с помощью COPY:

#! /bin/bash
echo "[Manager]
DefaultEnvironment=$(while read -r Line; do echo -n "$Line" ; done < <(env)
" >/etc/systemd/system.conf.d/myenvironment.conf
exec /lib/systemd/systemd
...