Как получить и установить случайный порт службы как env var внутри файла docker-compose?

Вот пример docker-compose.yml:

# docker-compose.yml

version: '3'

services:
  web:
    image: ghost:latest
    ports:
      - 0:2368
    environment:
      url: http://ghost.localhost:30001

Я хотел бы получить случайный порт службы и установить внутри переменную url env следующим образом:

url: "http://ghost.localhost:{{.Service.Port}}"

Конечная цель — развернуть несколько стеков без ручной установки порта.

docker stack deploy --compose-file=docker-compose.yml ghost1
docker stack deploy --compose-file=docker-compose.yml ghost2
docker stack deploy --compose-file=docker-compose.yml ghost3

Это возможно ?


person Johackim    schedule 06.10.2018    source источник


Ответы (3)


Нет, сейчас это невозможно. Есть запрос функции, но он все еще открыт (ему более 4 лет). ).

person Constantin Galbenu    schedule 09.10.2018
comment
запрос функции предназначен для получения порта внутри контейнера. однако вопрос заключается в решении для замены переменных, которое, вероятно, гораздо проще реализовать безопасно. - person raven; 03.01.2021

Да, вы можете выбрать диапазон портов (я бы рекомендовал использовать более высокий диапазон, например 9000-9100), но имейте в виду, что процесс запускается для каждого открытого порта: Почему Docker запускает так много процессов для сопоставления портов с моим приложением? Таким образом, производительность, скорее всего, будет далеко не идеальной.

Возможно, вы захотите изучить использование «хост-сети» докера или какую-либо другую сетевую настройку, отличную от стандартной.

person maxm    schedule 06.10.2018

Используйте файл .env для определения динамических значений в docker-compse.yml. Будь то порт или любое другое значение.

Пример докер-композиции:

testcore.web:
       image: xxxxxxxxxxxxxxx.dkr.ecr.ap-northeast-2.amazonaws.com/testcore:latest
       volumes: 
            - c:/logs:c:/logs
       ports:
            - ${TEST_CORE_PORT}:80
       environment:
            - CONSUL_URL=http://${CONSUL_IP}:8500 
            - HOST=${HOST_ADDRESS}:${TEST_CORE_PORT}

Внутри файла .env вы можете определить значение этих переменных:

CONSUL_IP=172.31.28.151
HOST_ADDRESS=172.31.16.221
TEST_CORE_PORT=10002
person sorabzone    schedule 06.10.2018