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"
]
}
}