docker-compose.yml 中的整数变量表达式

zap*_*pee 6 docker docker-compose

我想使用整数表达式docker-compose.yml来根据BASE_PORT变量设置端口。

我有一个.env包含以下内容的文件:

BASE_PORT=57900
Run Code Online (Sandbox Code Playgroud)

我的启动 bash 脚本如下所示:

#/bin/sh

. .env
docker-compose stop
docker-compose rm -v -f
docker-compose up -d adminserver
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

...
services:
  adminserver:
    image: ....
    hostname: ...
    ports:
      - ${BASE_PORT}:8001
    ...
Run Code Online (Sandbox Code Playgroud)

这种配置就像一个魅力,docker ps | grep 8001返回一个适当的内容。

但我想使用更多的端口配置和更多的ports部分:

...
services:
  adminserver:
    image: ....
    hostname: ...
    ports:
      - $((BASE_PORT+1)):8001
      - $((BASE_PORT+2)):8002
      - $((BASE_PORT+3)):8003
    ...

  databaseserver:
    image: ....
    hostname: ...
    ports:
      - $((BASE_PORT+10)):1541

  zookeeper:
    image: ....
    hostname: ...
    ports:
      - $((BASE_PORT+30)):2181

  kafka:
    image: ....
    hostname: ...
    ports:
      - $((BASE_PORT+40)):9092
      - $((BASE_PORT+41)):9093
      - $((BASE_PORT+42)):9094
Run Code Online (Sandbox Code Playgroud)

$((BASE_PORT+1))表达式在 shell 中有效,但在我的 *.yml 文件中无效。

我得到这个错误:

ERROR: Invalid interpolation format for "ports" option in service "adminserver": "$((BASE_PORT+1)):8001"
Run Code Online (Sandbox Code Playgroud)

知道如何使它工作吗?

Dav*_*aze 5

Docker Compose 只是不支持这一点。

在您的示例中,主机和容器端都有一系列连续的端口。 语法ports: 确实支持这种模式

ports:
  - '10000-10003:8000-8003'
Run Code Online (Sandbox Code Playgroud)

仍然没有表达式解析器或数学功能,但你可以写

ports:

  - '${BASE_PORT}-${FINAL_PORT}:8000-8003'
Run Code Online (Sandbox Code Playgroud)

这会更接近你所需要的。