docker compose命令数组中的求值表达式

docker compose命令数组中的求值表达式,docker,docker-compose,registrator,Docker,Docker Compose,Registrator,我有下面的docker-compose.yml文件。在命令部分中,我希望在将命令传递给docker engine之前计算curl表达式,即首先计算我的curl,然后使用-ip 10.0.0.2选项运行我的容器 version: '2' services: registrator: image: gliderlabs/registrator:v7 container_name: registrator volumes: - /var/run/docker.s

我有下面的docker-compose.yml文件。在
命令
部分中,我希望在将命令传递给docker engine之前计算
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-xget-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 compose
命令
将覆盖默认命令(CMD)(请参阅),因此它不会在容器启动之前执行,而是作为容器中的主命令执行

你可以这样做:

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-shttp://169.254.169.254/latest/meta-data/local-ipv4)“docker组装


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

在互联网上搜索了数小时并在此处发布了答案后,我最终决定采用以下解决方案。有关此操作的解释,请参阅@Ivonet-answer

我修改了
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

谢谢你的回答。它确实帮助我更好地理解了Docker。@Rash我的荣幸:-)