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

Docker容器中Gunicorn运行的Python Web应用无法通过浏览器访问

Docker容器化Python Web应用无法访问的问题排查与解决

问题描述

我是Docker新手,正尝试将一个Python Web应用容器化。为应用配置了Conda环境并在Dockerfile中完成初始化,应用通过Gunicorn运行,但无法通过浏览器连接到该Web应用。

我的Dockerfile内容

FROM python:slim

RUN apt-get update && apt-get -y upgrade \
  && apt-get install -y --no-install-recommends \
    git \
    wget \
    g++ \
    libxext6 \
    libxrender1 \
    ca-certificates \
    && rm -rf /var/lib/apt/lists/*
ENV PATH="/root/miniconda3/bin:${PATH}"
ARG PATH="/root/miniconda3/bin:${PATH}"
WORKDIR /app
ADD ./dashapp.yml ./dashapp.yml


RUN wget https://repo.anaconda.com/miniconda/Miniconda3-py39_4.9.2-Linux-x86_64.sh \
    && mkdir /root/.conda \
    && bash Miniconda3-py39_4.9.2-Linux-x86_64.sh -b \
    && rm -f Miniconda3-py39_4.9.2-Linux-x86_64.sh
    
RUN echo "Running $(conda --version)" && \
    conda init bash && \
    . /root/.bashrc && \
    conda update conda && \
    conda env create -f dashapp.yml

ADD . .

EXPOSE 8060
RUN echo "source activate dashapp" > ~/.bashrc
SHELL ["conda", "run", "-n", "dashapp", "/bin/bash", "-c"]
RUN gunicorn --workers=2 wsgi:server -b :8060 --daemon --capture-output --log-level debug --log-file=./gunicorn.log --timeout 90 --pid pid.txt

现象

构建镜像并使用命令 docker run -it --name app_cont -d -p 8060:8060 app_img 运行容器时,容器正常运行,能查看Gunicorn日志,但无法在浏览器通过localhost:8060访问应用。

但如果注释掉Dockerfile的最后一条RUN指令,构建并运行容器后,进入容器执行相同的Gunicorn启动命令:
gunicorn --workers=2 wsgi:server -b :8060 --daemon --capture-output --log-level debug --log-file=./gunicorn.log --timeout 90 --pid pid.txt,就能正常通过浏览器访问应用。

问题根源

Docker的RUN指令是在镜像构建阶段执行命令,构建完成后这些进程不会随容器启动而运行。你最后一条RUN启动了后台的Gunicorn,但这只是在构建镜像的临时容器里运行,构建完成后这个进程就终止了,实际启动容器时并没有Gunicorn进程在运行,自然无法访问。

而进入容器手动执行命令,是在容器运行阶段启动的Gunicorn,此时进程属于运行中的容器,所以能正常对外提供服务。

修复方案

把启动Gunicorn的命令从RUN改成CMD或者ENTRYPOINT,这两个指令是用来定义容器启动时要执行的命令:

修改后的Dockerfile末尾部分

EXPOSE 8060
RUN echo "source activate dashapp" > ~/.bashrc
SHELL ["conda", "run", "-n", "dashapp", "/bin/bash", "-c"]
# 替换RUN为CMD,并且去掉--daemon参数(后台运行在容器里没必要,让Gunicorn前台运行才能维持容器存活)
CMD ["gunicorn", "--workers=2", "wsgi:server", "-b", ":8060", "--capture-output", "--log-level", "debug", "--log-file=./gunicorn.log", "--timeout", "90"]

额外说明

  • 去掉--daemon参数:容器的主进程必须前台运行,否则容器会因为主进程退出而停止。如果Gunicorn后台运行,容器启动后主进程结束,容器就会退出(你之前用-d后台运行容器可能没注意到这点,但实际Gunicorn没在运行)。
  • CMD vs ENTRYPOINT:如果需要固定启动命令用ENTRYPOINT,如果需要允许运行容器时覆盖命令用CMD,这里用CMD足够。

内容的提问来源于stack exchange,提问作者ratiom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:55:18