可以在 systemd Environment 字段中使用脚本命令吗?

Kev*_*ner 4 environment-variables systemd

我有一个 docker-compose 文件,用于为我的服务启动多个容器。其中一个容器需要设置一个环境变量(准确地说是服务器的公共 ip)。操作系统是新安装的 Ubuntu 15.10 服务器虚拟机。

我正在尝试找到一种方法来为 systemd 提供此功能。到目前为止,我想出的最好的是:

[Unit]
Description=service for my product
Requires=docker.service
After=docker.service

[Service]
Environment=MY_MASTER_IP=`/sbin/ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/'`
Environment=MY_NETWORK_NAME="mynetwork"

Restart=always
ExecStart=/usr/local/bin/docker-compose -f /app/master/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /app/master/docker-compose.yml stop

[Install]
WantedBy=local.target
Run Code Online (Sandbox Code Playgroud)

但是,当我使用systemd-analyze verify myapp.servicesystemd 时,它会通过告诉我带有 crazy shell 命令的行无效并将被忽略来做出响应。

[/lib/systemd/system/myapp.service:8] Invalid environment assignment, ignoring: MY_MASTER_IP=`/sbin/ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1  -d'/')`
Run Code Online (Sandbox Code Playgroud)

我还尝试将变量赋值直接放在 docker-compose 命令 ( MY_MASTER_IP=blah blah blah /docker-compose yadda yadda) 之前,就像我对 upstart 所做的那样,但 systemd 更不喜欢这个。

那么环境线可以这样使用吗,如果不是,处理这个问题的最好/最优雅/最简单的方法是什么?

小智 6

不,因为 systemd 单元不是 shell 脚本,也没有命令替换支持。这是一个有意的设计决定。

  • 是的,我最终创建了一个脚本,该脚本在 ExecStartPre 语句中调用,该语句将所有文件写入 EnvironmentFile。这似乎是处理它的最有效和最简单的方法。 (4认同)