Docker-составить несколько портов - PullRequest
1 голос
/ 20 июня 2019

Мой вопрос касается предоставления нескольких портов в одной строке из примера переменной ENV, и эти порты не являются последовательными, одни и те же порты хоста будут одинаковыми для контейнера.

PORTS=80
PORTS=80,443
PORTS=80 443

И выставить их в docker-compose.

в соответствии с документами , вы можете сделать.

ports:
 - "3000"
 - "3000-3005"
 - "8000:8000"
 - "9090-9091:8080-8081"
 - "49100:22"
 - "127.0.0.1:8001:8001"
 - "127.0.0.1:5000-5010:5000-5010"
 - "6060:6060/udp"

Но я бы хотел сделать это другим способом

ports:
  - ${PORTS}:${PORTS}
#Sometimes this will be 
ports:
  - 80:80

#Other times this will be
ports:
  - 80,443:80,443 # Is this possible?
ports:
  - 80-443:80-443 # Don't want this because will export all the ports between
ports:
  - 80 443:80 443 # I think this is wrong syntax

Любая подсказка или любая другая идея?

1 Ответ

2 голосов
/ 20 июня 2019

IIUC, вы не можете указать отображение ports динамически.

Файл YAML Docker Compose является в основном статической конфигурацией.

Одним из способов решения вашей проблемы является создание YAML-файла (раздел ports).

Вы можете и использовать инструмент типа sed для замены переменной в вашем Compose-файле сгенерированным выводом.

Предположим, у вас есть docker-compose.yaml:

  service:
    ...
    {{PORTS}}

Тогда

# List of ports to create
PORTS="80 443 8888"

# Generates "80:80""443:443""8888:8888" NB no commas between items
PORTS=$(for PORT in ${PORTS}; do printf '"%s:%s"' ${PORT} ${PORT}; done)

# Separate items with commas
PORTS=$(echo ${PORTS} | sed 's|""|","|g')

# Finalize the syntax for ports
PORTS="ports: [${PORTS}]"

# Replace {{TEMPLATE}} with the result
sed "s|{{PORTS}}|${PORTS}|g" docker-compose.yaml > docker-compose.new.yaml

даст docker-compose.new.yaml:

  service:
    ...
    ports: ["80:80","443:443","8888:8888"]

Это не очень элегантно, но этого должно быть достаточно.

NB Я создаю порты как JSON для удобства (чтобы избежать проблем с переводом строки). YAML - это расширенный набор JSON, поэтому вы можете использовать JSON вместо YAML для файлов Docker Compose.

Google (мой работодатель) имеет очень хороший инструмент для генерации JSON (!) С использованием языка шаблонов на основе JSON: Jsonnet . Поскольку YAML является надмножеством JSON, вы можете использовать JSON вместо YAML в файлах Docker Compose.

Jsonnet:

local ports = ["80", "443", "8888"]; 
{"service":{
    "ports": [
        port + ":" + port
        for port in ports
    ]
}}

Формирует:

{
  "service": {
    "ports": [
      "80:80",
      "443:443",
      "8888:8888"
    ]
  }
}
...