You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Heroku部署Docker镜像:如何在Dockerfile中使用传入的PORT环境变量

解决Heroku部署Docker镜像时的端口环境变量使用问题

问题描述

尝试将Docker镜像部署至Heroku平台,Heroku不允许在Dockerfile中指定固定端口,而是通过docker run -p 80:$PORT -e PORT=$PORT这类命令传递PORT环境变量。现有Dockerfile的CMD部分尝试使用${PORT},但无法正确读取环境变量:

FROM python:3.9-slim-buster

WORKDIR /app

# install dependencies
COPY ./requirements.txt /app
RUN pip install --no-cache-dir --upgrade -r requirements.txt

RUN apt-get update && apt-get install -y libsndfile1
RUN apt-get update && apt-get install -y ffmpeg

RUN useradd -m -u 1000 user
USER user

ENV HOME=/home/user \
    PATH=/home/user/.local/bin:$PATH

WORKDIR $HOME/app

COPY --chown=user . $HOME/app

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "${PORT}"]

解决方案

原Dockerfile的问题在于exec格式的CMD不会解析shell环境变量,${PORT}会被当作字面量字符串传递给uvicorn,导致无法正确监听Heroku分配的端口。可以通过以下两种方式修改:

方式1:使用shell格式的CMD

直接改用shell模式的CMD,让shell自动解析$PORT环境变量:

CMD uvicorn main:app --host 0.0.0.0 --port $PORT

方式2:通过sh -c包裹exec格式命令

如果需要保留exec格式的结构,可以用sh -c来执行命令,让shell处理环境变量解析:

CMD ["sh", "-c", "uvicorn main:app --host 0.0.0.0 --port $PORT"]

说明

Heroku会在容器启动时自动设置PORT环境变量,无需手动指定。只要应用通过上述方式正确读取该变量并监听对应端口,就能正常接收外部请求。

内容的提问来源于stack exchange,提问作者Zine eddine Boumaza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:42:44