我有一个 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.service
systemd 时,它会通过告诉我带有 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) 我有一个脚本(run-docker-container.sh)调用另一个脚本(create-docker-container.sh)。create-docker-container 针对 docker 远程 api 执行curl 脚本并返回 http 代码,如果成功则返回零。创建脚本因此返回
echo $RVAL
exit $RVAL
Run Code Online (Sandbox Code Playgroud)
在我的测试中, $RVAL 的值为 404,这是我对这个问题感兴趣的值。
在我的 run-docker-container 脚本中,我有以下几行
create-docker-container.sh $CONTAINER_NAME $CONTAINER_SETTINGS
rval=$?
echo $rval
if [ $rval -eq 404 ]; then
...
fi
Run Code Online (Sandbox Code Playgroud)
尽管 create 似乎以 404 退出,但我得到的值$?
是 148,因此我的条件处理没有被调用。为什么会这样以及如何正确从脚本中获取退出代码?