docker在命令数组中编写求值表达式



我有下面的docker-compose.yml文件。在command部分中,我想在将命令传递给docker引擎之前评估curl表达式,即应该首先评估我的curl,然后使用-ip 10.0.0.2选项运行我的容器。

version: '2'
services:
registrator:
image: gliderlabs/registrator:v7
container_name: registrator
volumes:
- /var/run/docker.sock:/tmp/docker.sock
command: ['-ip', '$$(curl -X GET -s http://169.254.169.254/latest/meta-data/local-ipv4)']

然而,这并没有被评估,我的选项被传递为-ip $(curl -X GET -s http://169.254.169.254/latest/meta-data/local-ipv4)

然而,相应的docker run命令正确地评估了表达式,并且我的容器正确地以-ip 10.0.0.2选项开头:

docker run -v /var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator:v7 -ip $(curl -X GET -s http://169.254.169.254/latest/meta-data/local-ipv4)

命令行上的docker命令将起作用,因为该命令将由shell执行,而不是由docker映像执行,因此它将被解析。

docker composecommand将覆盖默认命令(CMD((请参阅https://docs.docker.com/compose/compose-file/#command)因此它不会在容器启动之前执行,而是作为容器中的主要命令。。。

你可以做一些类似的事情:

version: '2'
services:
registrator:
image: gliderlabs/registrator:v7
container_name: registrator
volumes:
- /var/run/docker.sock:/tmp/docker.sock
command: ['-ip', '${IP}']

并使用运行

IP="$(curl -X GET -s http://169.254.169.254/latest/meta-data/local-ipv4)" docker-compose up

这将再次在shell中运行它,并将其分配给一个名为IP的变量。在docker-compose up命令期间,IP交换机将可用。您可以将该命令放在shell脚本中以使其更容易。

在互联网上搜索了几个小时并在这里发布了答案后,我终于选择了下面的解决方案。关于为什么这样做,请参考@Ivonet答案。

我修改了Dockerfile,以便在容器启动时运行脚本。

FROM gliderlabs/registrator:v7
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh && 
apk update && 
apk add curl
ENTRYPOINT ["/entrypoint.sh"]

脚本entrypoint.sh也非常简单。它首先检查是否可以调用端点。成功的响应会触发我的容器以正确的IP地址开始,而不成功的响应(用于本地测试(不会设置任何值。

#!/bin/sh
LOCAL_IP=$(curl -s --connect-timeout 3 169.254.169.254/latest/meta-data/local-ipv4)
if [ $? -eq 0 ]; then
/bin/registrator -ip $LOCAL_IP $@
else
/bin/registrator $@
fi

最新更新