Erben Sie Umgebungsvariablen im Docker-Container systemd

9

Ich habe einen Docker-Container, auf dem systemd ausgeführt wird . Ich möchte Umgebungsvariablen an Anwendungen darunter übergeben.

Wenn ich systemd in Docker ( /sbin/initals Befehlszeile) starte, macht Docker Variablen für systemd verfügbar , jedoch nicht für untergeordnete Dienste . Wenn ich systemd.setenv=...zur cmdline hinzufüge , werden die Variablen übergeben. Ich suche eine sauberere Lösung.

Wie mache ich Umgebungsvariablen verfügbar, die an /sbin/initvon ihr gestartete Anwendungen übergeben werden?

% 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

Ich erwarte zu sehen, VAR1=1während mein Befehl ausgeführt wird.

Mit anderen Worten, kann systemd Variablen an Kinder übergeben, die es startet?

Informationen zu Dockerfile finden Sie im Github-Repository .

Motiejus Jakštys
quelle

Antworten:

9

Um die gestellte Frage zu beantworten (da sie nirgendwo anders beantwortet zu werden scheint)

"Wie kann ich Umgebungsvariablen, die an / sbin / init übergeben wurden, für von ihm gestartete Anwendungen verfügbar machen?"

erfordert einige leicht irritierende Bash und eine äußerst nützliche Funktion des Linux / Proc-Dateisystems:

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

Dies lautet / proc / 1 / envion. Dies ist die Umgebung, die PID 1 zugewiesen wurde, die jedoch durch Nullen begrenzt ist. Es verwendet 'tr', um die Nullen durch neue Zeilen zu ersetzen, iteriert dann über diese Zeilen und wertet sie mit einem vorangestellten 'Export' aus, sodass sie für untergeordnete Prozesse sichtbar sind.

Die nicht exponierenden Umgebungsvariablen sind ein weiteres "Merkmal" von systemd, und sie betrachten es nicht als Fehler.

xrobau
quelle
3
Ich möchte sagen 'Ich brauche diese Funktion nicht, ich brauche Umgebungsvariablen'
Daniel Dai
2

Gemäß dieser Beschreibung erbt eine systemd-Benutzerinstanz keine Umgebungsvariablen:

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

Hier wird vorgeschlagen, den Dienst oneshot systemd zu verwenden, der eine Umgebungsdatei für den "endgültigen" Dienst konfiguriert.

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

Janosi
quelle
1
Denken Sie auch daran, dies zu überprüfen PassEnvironment=. Es hat mir in der Docker-Systemumgebung geholfen.
FelikZ