docker-compose评估命令数组中的表达式

时间:2018-11-10 18:28:43

标签: docker docker-compose registrator

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

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)

2 个答案:

答案 0 :(得分:1)

命令行上的docker命令将起作用,因为该命令将由外壳而不是docker映像执行,因此它将得到解决。

docker-compose command将覆盖默认命令(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

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

答案 1 :(得分:0)

在互联网上搜索了此处发布的小时数和答案后,我终于找到了以下解决方案。有关为何有效的解释,请参阅@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