我有一个 docker-compose 文件,用于为我的服务启动多个容器。这些容器之一需要设置一个环境变量(准确地说是服务器的公共IP)。操作系统是新安装的 Ubuntu 15.10 Server 虚拟机。
我正在尝试找到一种方法来通过 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
但是,当我使用systemd-analyze verify myapp.service
systemd 时,它会告诉我包含疯狂 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'/')`
我还尝试将变量赋值直接放在 docker-compose 命令 ( MY_MASTER_IP=blah blah blah /docker-compose yadda yadda
) 之前,就像我对 upstart 所做的那样,但 systemd 更不喜欢这样做。
那么环境线可以这样使用吗?如果不能,处理这个问题的最佳/最优雅/最简单的方法是什么?
答案1
不,因为 systemd 单元不是 shell 脚本,也不支持命令替换。这是一个有意的设计决定。