从 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 分配给它的端口。有什么办法可以很好地实现这一目标吗?
示例:
您的 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
我有一个 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 分配给它的端口。有什么办法可以很好地实现这一目标吗?
示例:
您的 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