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
相关产品推荐
相关产品推荐

