Hériter des variables d'environnement dans le conteneur Docker systemd

9

J'ai un conteneur Docker exécutant systemd . Je souhaite transmettre des variables d'environnement aux applications situées en dessous.

Lorsque je démarre systemd à partir de Docker ( /sbin/initen ligne de commande), Docker expose des variables à systemd, mais n'expose pas aux services enfants . Si j'ajoute systemd.setenv=...à la cmdline, les variables sont passées. Je recherche une solution plus propre.

Comment exposer les variables d'environnement transmises /sbin/initaux applications démarrées par celui-ci?

% 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

Je m'attends à voir VAR1=1tout en exécutant ma commande.

En d'autres termes, systemd peut-il transmettre des variables qui lui sont transmises aux enfants qu'il démarre?

Pour Dockerfile, voir le référentiel github .

Motiejus Jakštys
la source

Réponses:

9

Pour répondre à la question posée (car il ne semble pas y avoir de réponse ailleurs)

"Comment exposer les variables d'environnement passées à / sbin / init aux applications démarrées par celui-ci?"

nécessite un bash légèrement irritant, et une fonction extrêmement utile du système de fichiers linux / proc:

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

Ceci lit / proc / 1 / envion, qui est l'environnement donné au PID 1, mais est délimité par des valeurs nulles. Il utilise «tr» pour remplacer les valeurs nulles par de nouvelles lignes, puis itère sur ces lignes et les évalue avec une «exportation» préfixée, afin qu'elles soient visibles pour les processus enfants.

Les variables d'environnement non exposantes sont encore une autre "fonctionnalité" de systemd, et elles ne le considèrent pas comme un bogue.

xrobau
la source
3
Je veux dire «Je n'ai pas besoin de cette fonctionnalité, j'ai besoin de variables d'environnement»
Daniel Dai
2

Selon cette description, une instance d'utilisateur systemd n'hérite pas de variables d'environnement:

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

Il est suggéré ici d'utiliser le service oneshot systemd qui configure un EnvironmentFile pour le service "final".

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

janosi
la source
1
Pensez également à vérifier PassEnvironment=. Cela m'a aidé dans l'environnement docker systemd.
FelikZ