如何在docker-compose文件中获取随机服务端口并将其设置为env var?

时间:2018-10-06 09:08:20

标签: docker docker-compose docker-swarm docker-stack

以下是docker-compose.yml的示例:

# docker-compose.yml

version: '3'

services:
  web:
    image: ghost:latest
    ports:
      - 0:2368
    environment:
      url: http://ghost.localhost:30001

我想获得服务随机端口,并在url env变量中进行如下设置:

url: "http://ghost.localhost:{{.Service.Port}}"

最终的目标是无需手动设置端口即可部署多个堆栈。

docker stack deploy --compose-file=docker-compose.yml ghost1
docker stack deploy --compose-file=docker-compose.yml ghost2
docker stack deploy --compose-file=docker-compose.yml ghost3

有可能吗?

3 个答案:

答案 0 :(得分:0)

是的,您可以选择端口范围(我建议使用更高的范围,例如9000-9100),但是请记住,每个打开的端口都在启动一个进程:Why does Docker run so many processes to map ports though to my application?因此,性能是可能会不理想。

您可能想研究使用docker“主机网络”或其他一些非默认网络设置。

答案 1 :(得分:0)

使用.env文件在docker-compse.yml中定义动态值。是port还是其他任何值。

示例docker-compose:

testcore.web:
       image: xxxxxxxxxxxxxxx.dkr.ecr.ap-northeast-2.amazonaws.com/testcore:latest
       volumes: 
            - c:/logs:c:/logs
       ports:
            - ${TEST_CORE_PORT}:80
       environment:
            - CONSUL_URL=http://${CONSUL_IP}:8500 
            - HOST=${HOST_ADDRESS}:${TEST_CORE_PORT}

在.env文件中,您可以定义以下变量的值:

CONSUL_IP=172.31.28.151
HOST_ADDRESS=172.31.16.221
TEST_CORE_PORT=10002

答案 2 :(得分:0)

否,目前无法执行。有一个feature request,但它仍然是开放的(已有4年以上的历史了。)