![](/img/trans.png)
[英]executing commands in containers from within a container using docker-compose up vs docker-compose run
[英]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。 有沒有辦法以一種很好的方式實現這一目標?
您在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.