【问题标题】:docker-compose evaluate expression in command arraydocker-compose 在命令数组中计算表达式
【发布时间】:2019-04-13 23:47:00
【问题描述】:

我有以下 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 docker-compose registrator


    【解决方案1】:

    命令行中的docker命令会起作用,因为命令会被shell而不是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

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

    【讨论】:

    • 感谢您的回答。它确实帮助我更好地理解了 Docker。
    • @Rash 我的荣幸 :-)
    【解决方案2】:

    在互联网上搜索了几个小时并在此处发布了答案后,我终于确定了以下解决方案。有关此工作原理的说明,请参阅@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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多