Eredita variabili di ambiente nel contenitore Docker di systemd


9

Ho un container Docker con systemd . Voglio passare le variabili di ambiente alle applicazioni in esso contenute.

Quando avvio systemd da Docker ( /sbin/initcome riga di comando), Docker espone le variabili a systemd, ma non espone ai servizi figlio . Se aggiungo systemd.setenv=...al cmdline, le variabili vengono passate. Sto cercando una soluzione più pulita.

Come esporre le variabili di ambiente passate /sbin/initalle applicazioni avviate da esso?

% 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

Mi aspetto di vedere VAR1=1mentre eseguo il mio comando.

In altre parole, systemd può passare variabili passate ad esso ai bambini che inizia?

Per Dockerfile, consultare il repository github .

Risposte:


9

Per rispondere alla domanda posta (poiché non sembra avere risposta altrove)

"Come posso esporre le variabili di ambiente passate a / sbin / init alle applicazioni avviate da esso?"

richiede un po 'di irritazione bash e una funzione estremamente utile del filesystem linux / proc:

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

Questo legge / proc / 1 / envion, che è l'ambiente dato a PID 1, ma è delimitato da null. Usa 'tr' per sostituire i null con nuove righe, quindi scorre su quelle righe e le elimina con una 'esportazione' anteposta, quindi sono visibili ai processi figlio.

Le variabili di ambiente non esposte sono ancora un'altra "caratteristica" di systemd e non la considerano un bug.


3
Voglio dire 'Non ho bisogno di questa funzione, ho bisogno di variabili d'ambiente'
Daniel Dai,

2

Secondo questa descrizione, un'istanza utente di systemd non eredita le variabili di ambiente:

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

C'è un suggerimento qui per usare il servizio systemd oneshot che configura un File Environment per il servizio "finale".

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


1
Considera anche di controllare PassEnvironment=. Mi ha aiutato nell'ambiente di sistema docker.
FelikZ,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.