首页 > 解决方案 > Docker-compose 多个端口暴露

问题描述

我的问题是关于从变量示例中在一行中公开多个端口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

任何线索或任何其他想法?

标签: dockernginxdocker-compose

解决方案


IIUC 您不能ports动态指定映射。

Docker Compose YAML 文件大多是静态配置。

解决您的问题的一种方法是生成 ( portssection) YAML 文件。

您可以并使用一种工具,例如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"]

它不是很优雅,但应该足够了。

注意,为了方便起见,我将端口生成为 JSON(以避免换行问题)。YAML 是 JSON 的超集,因此您可以在 Docker Compose 文件中使用 JSON 而不是 YAML。

谷歌(我的雇主)有一个非常好的工具,可以使用基于 JSON 的模板语言生成 JSON(!):Jsonnet。因为 YAML 是 JSON 的超集,所以您可以在 Docker Compose 文件中使用 JSON 而不是 YAML。

网络:

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

生成:

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

推荐阅读