簡體   English   中英

從 docker-compose 中獲取暴露的端口

[英]Get exposed port from within docker-compose

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

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

dockerfile:

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

當我調用docker-compose up --scale server=2來運行兩個服務器容器時,我無法發送 HTTP 請求,因為端口映射不匹配。

基本上我要做的是讓每個容器使用 docker-compose 分配給它的端口運行 uwsgi。 有沒有辦法以一種很好的方式實現這一目標?

例子: 在此處輸入圖像描述

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

您在server服務定義中缺少HOST_PORT部分。 根據https://docs.docker.com/compose/networking/ ,服務的端口定義應該是HOST_PORT:CONTAINER_PORT 否則將選擇一個隨機的HOST_PORT

您可以在此處克隆一個工作示例環境或此處查看它的工作情況。

您始終可以通過發出以下命令查看 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM