代码之家  ›  专栏  ›  技术社区  ›  Rash

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

  •  1
  • Rash  · 技术社区  · 5 年前

    我有下面的docker-compose.yml文件。在 command curl 表达式,然后再将命令传递给docker引擎,即首先计算my 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命令正确地计算表达式,并且我的容器正确地以

    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 回复  |  直到 5 年前
        1
  •  1
  •   Ivonet    5 年前

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

    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 witch的变量,该变量将在 docker-compose up 指挥部。您可以将该命令放在shell脚本中以使其更简单。

        2
  •  0
  •   Rash    5 年前

    在网上搜索了几个小时并在这里发布了答案后,我最终选择了下面的解决方案。有关此操作的解释,请参阅@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

    #!/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