systemd — указание параметров окружения сервиса

Задача: при старте юнита надо динамически сформировать параметры его окружения. Одно из решений приводится в Using Environment Variables In systemd Units:

Сначала один сервис создаёт файл с переменными окружения:

cat fleet_machines.service
[Unit]
Description=Generates /etc/fleet_machines.env file
After=etcd2.service
Requires=etcd2.service
After=fleet.service
Requires=fleet.service

[Service]
Type=oneshot
ExecStart=/usr/bin/sh -c "/usr/bin/echo -n FLEET_MACHINES= > /etc/fleet_machines.env"
ExecStart=/usr/bin/sh -c "/usr/bin/fleetctl list-machines -fields='ip,machine' -no-legend=true -full=true | tr '\t' '=' | tr '\n' ',' >> /etc/fleet_machines.env"

затем второй юнит запускает сам сервис, при этом второй юнит ззапускается только после первого:

cat container.service
[Unit]
Description=My test Docker container
After=docker.service
Requires=docker.service
After=fleet_machines.service
Requires=fleet_machines.service

[Service]
EnvironmentFile=/etc/fleet_machines.env
ExecStartPre=-/usr/bin/docker kill %p
ExecStartPre=-/usr/bin/docker rm %p
ExecStartPre=/usr/bin/docker pull ubuntu:latest
ExecStart=/usr/bin/docker run --rm --name %p -e FLEET_MACHINES ubuntu:latest bash -c 'while true; do echo "$FLEET_MACHINES"; sleep 1; done'

Там же есть и другие варианты.

Leave a Reply