docker-compose оценочное выражение в массиве команд - PullRequest
0 голосов
/ 10 ноября 2018

У меня ниже файл docker-compose.yml. В разделе command я хотел бы оценить выражение 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 правильно оценивает выражение, и мой контейнер правильно запускается с параметром -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 голосов
/ 11 ноября 2018

После поиска в Интернете часов и ответов, опубликованных здесь, я, наконец, остановился на следующем решении. Для объяснения того, почему это работает, обратитесь к ответу @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
0 голосов
/ 11 ноября 2018

Команда 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, которая будет доступна во время команды docker-compose up. Вы можете поместить эту команду в скрипт оболочки, чтобы упростить ее.

...