从 docker-compose 中获取暴露的端口

Get exposed port from within docker-compose

我有一个 docker-compose.yml 文件如下:

version: "3.9"
services:
  server:
    build: .
    ports:
      - "8086"
    environment:
      - PORT=8086

一个docker文件:

FROM python:3.8

RUN python -m pip install --upgrade pip
RUN pip install pipenv

COPY Pipfile* /app/

RUN cd /app &&  pipenv lock --keep-outdated --requirements > requirements.txt

RUN pip install -r /app/requirements.txt

COPY . /app/src

WORKDIR /app/src

EXPOSE ${PORT}

CMD uwsgi --http :${PORT} --wsgi-file server.py --callable main

所以基本上,我在给定端口上 运行 连接一个服务器,我在我的 Dockerfile 和 docker-compose 中公开它。但是,当我 运行 这些容器的两个实例时,我需要一种方法让它们各自使用自己的端口。我也不能对值进行硬编码,因为我需要能够扩展到 n 个实例。因此,与其使用环境变量 PORT,我需要以某种方式从 运行ning 容器中获取每个端口,公开它,然后 运行 该端口上的服务器。

当我调用 docker-compose up --scale server=2 到 运行 两个服务器容器时,我无法发送 HTTP 请求,因为端口映射不匹配。

基本上我想做的是让每个容器 运行 uwsgi 使用 docker-compose 分配给它的端口。有什么办法可以很好地实现这一目标吗?

示例:

来源:https://github.com/distribworks/dkron

您的 server 服务定义中缺少 HOST_PORT 部分。根据 https://docs.docker.com/compose/networking/,服务的端口定义应为 HOST_PORT:CONTAINER_PORT。否则将随机选择 HOST_PORT

您可以克隆一个工作示例环境here or see it working here

您始终可以通过以下命令查看 Docker Compose 选择的端口:

jdsalaro$ docker ps

CONTAINER ID   IMAGE                                                         COMMAND                  CREATED          STATUS          PORTS                     NAMES
de0120c61c1e   65896179-get-exposed-port-from-within-docker-compose_server   "/bin/sh -c 'uwsgi -…"   12 seconds ago   Up 11 seconds   0.0.0.0:49157->8086/tcp   65896179-get-exposed-port-from-within-docker-compose_server_1

要解决您的问题,只需提供 HOST_PORT 如前所述:

version: "3.9"
services:
  server:
    build: .
    ports:
      - "8086:8086"
    environment:
      - PORT=8086

使用 --scale 时,例如 --scale server=4,可以提供一系列端口作为 HOST_PORT,而不是如下所示:

version: "3.9"
services:
  server:
    build: .
    ports:
      - "8000-8004:8086"
    environment:
      - PORT=8086