web-dev-qa-db-fra.com

passer des variables d'environnement aux services démarrés avec systemctl

J'ai un service nodeJS construit en utilisant NodeJs. Ce service nécessite la transmission de certaines variables d’environnement. De plus, j'ai créé un fichier unité systemd pour le démarrer à partir de systemctl. Pour des raisons étranges, le service, lorsqu'il est démarré avec systemctl, ne lit pas les variables d'environnement. Par exemple, l'une des variables d'environnement est l'hôte, qui contient l'adresse IP à laquelle l'application Sails sera liée. Cependant, si je lance le service avec élévateur de voiles ou nœud app.js, il lit les variables d'environnement. Voici le fichier unité:

[Unit]
Description=project

[Service]
ExecStart=/usr/bin/node /mnt/project/app.js
Restart=always
StandardOutput=syslog

[Install]
WantedBy=multi-user.target

J'ai tout essayé. J'ai ajouté les variables d'environnement à/etc/environment et lui ai pointé le fichier d'unité. Je les ai aussi ajoutées au fichier d'unité, mais rien n'a fonctionné.

4
Nicolas El Khoury

Cela se produit car une unité de systemd est encapsulée depuis le reste du système. Avez-vous essayé de le définir directement dans le fichier unité comme ceci?

Environment = "FOO = foo" 'BAR = bar'

Les variables FOO et BAR sont alors disponibles dans votre unité. Par exemple, s'il s'agit de mon ExecuteStart:

ExecStart =/bin/echo $ FOO $ {FOO} $ {BAR}

Avec l'option Environment ci-dessus, le résultat est le suivant:

foo foo bar

Une alternative serait de le faire via un fichier de configuration d'environnement. Pour cela, vous pouvez lire la documentation de Fedora:

http://fedoraproject.org/wiki/Packaging:Systemd#EnvironmentFiles_and_support_for_.2Fetc.2Fsysconfig_files

Ce lien contient des exemples utiles avec docker:

https://coreos.com/os/docs/latest/using-environment-variables-in-systemd-units.html

6
kuwiano