Dziedzicz zmienne środowiskowe w systemdowym kontenerze Docker

9

Mam uruchomiony systemd kontener Docker . Chcę przekazać zmienne środowiskowe do aplikacji pod nim.

Kiedy uruchamiam systemd z Dockera ( /sbin/initjako linia poleceń), Docker udostępnia zmienne systemd, ale nie udostępnia usług potomnych . Jeśli dodam systemd.setenv=...do cmdline, zmienne są przekazywane. Szukam czystszego rozwiązania.

Jak odsłonić zmienne środowiskowe przekazywane do /sbin/inituruchomionych przez niego aplikacji?

% 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

Spodziewam się zobaczyć VAR1=1podczas wykonywania polecenia.

Innymi słowy, czy systemd może przekazywać zmienne przekazywane do dzieci, które uruchamia?

Aby uzyskać plik Dockerfile, zobacz repozytorium github .

Motiejus Jakštys
źródło

Odpowiedzi:

9

Aby odpowiedzieć na zadane pytanie (ponieważ wydaje się, że nie ma na nie odpowiedzi nigdzie indziej)

„Jak mogę udostępnić zmienne środowiskowe przekazane do / sbin / init aplikacjom przez niego uruchomionym?”

wymaga nieco irytującego basha i niezwykle przydatnej funkcji systemu plików linux / proc:

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

Odczytuje to / proc / 1 / envion, czyli środowisko podane PID 1, ale ograniczone przez null. Używa „tr”, aby zastąpić wartości zerowe nowymi liniami, a następnie iteruje je i ewaluuje za pomocą wcześniejszego „eksportu”, aby były widoczne dla procesów potomnych.

Nieujawniające się zmienne środowiskowe to kolejna „cecha” systemd i nie uważają tego za błąd.

Xrobau
źródło
3
Chcę powiedzieć „nie potrzebuję tej funkcji, potrzebuję zmiennych środowiskowych”
Daniel Dai
2

Zgodnie z tym opisem, systemowa instancja użytkownika nie dziedziczy zmiennych środowiskowych:

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

Istnieje tutaj sugestia, aby użyć usługi oneshot systemd, która konfiguruje plik EnvironmentFile dla usługi „końcowej”.

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

janosi
źródło
1
Rozważ również sprawdzenie PassEnvironment=. Pomogło mi to w środowisku systemowym dokera.
FelikZ