docker - 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
任何线索或任何其他想法?
解决方案
IIUC 您不能ports
动态指定映射。
Docker Compose YAML 文件大多是静态配置。
解决您的问题的一种方法是生成 ( ports
section) 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"
]
}
}
推荐阅读
- c++ - 查找整数值并将该值传递给循环中的另一个整数但是整数被重置为初始值
- c# - 来自命名空间 Kendo.Mvc.Infrastructure 的 AggregateResult - 从 Json 反序列化
- scala - Spark 中的 Window 与 GroupBy 性能
- jquery - 如何在每个用户每次访问时仅显示一次加载模式
- python - 在文件中存储大量自定义 Python 对象的最佳方法是什么?
- c# - 将 Json 传递给 rest api 的语法
- c# - 在 asp.net web api 响应中保护用户数据
- cmake - 如何在 cmake 项目中启用 Visual Studio Community 2019 中的 C++17 编译?
- excel - 在单元格更改不更新时执行 excel VBA 宏
- c# - 加入多对多关系表后获取计数