如何使用Python3.7和Pipenv为Flask应用程序运行Docker容器?

3
我的 Dockerfile 内容如下:

FROM ubuntu:18.04
RUN apt-get -y update
RUN apt-get install -y software-properties-common
RUN add-apt-repository ppa:deadsnakes/ppa
RUN apt-get update -y
RUN apt-get install -y python3.7 build-essential python3-pip
ENV LC_ALL C.UTF-8
ENV LANG C.UTF-8
RUN pip3 install pipenv
COPY . /app
WORKDIR /app
RUN pipenv install
EXPOSE 5000
CMD ["pipenv", "run", "python3", "application.py"]

当我执行docker build -t flask-sample:latest .时,它构建成功(我想)。

我使用docker run -d -p 5000:5000 flask-sample运行,并且看起来正常。

但是当我访问http://localhost:5000时,没有加载任何内容。我做错了什么?


1
一个常见的原因是您的Flask应用程序侦听容器专用的localhost地址; 您将在容器日志中看到Running on http://127.0.0.1:5000/,如果您看到这个消息,则无法从外部访问容器。在Docker中部署最小的flask应用程序-服务器连接问题更详细地描述了这一点。如果这没有帮助,查看实际的容器日志和足够的应用程序源代码以重现问题将非常有用。 - David Maze
2个回答

4
为什么需要虚拟环境?为什么使用Ubuntu作为基础层:
较为简单的方法是:
Dockerfile:
FROM python:3
  
WORKDIR /usr/src/

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY app.py .


ENTRYPOINT FLASK_APP=/usr/src/app.py flask run --host=0.0.0.0

在你的requirements.txt文件中放置所需的软件包(例如flask)。 构建镜像: docker build -t dejdej/flasky:latest .

启动容器: docker run -it -p 5000:5000 dejdej/flasky

如果必须使用虚拟环境,可以尝试使用venv:


FROM python:2.7

RUN virtualenv /YOURENV
RUN /YOURENV/bin/pip install flask

CMD ["/YOURENV/bin/python", "application.py"]

-it 是什么作用? - Shamoon
-i = 即使未连接也保持 STDIN 开启,-t = 分配伪终端,如果它是 -d(分离)的相反,则在后台运行容器会有一些难以调试的问题。 - dejanualex
我应该使用 ENTRYPOINT 还是 CMD - Shamoon
1
取决于您想要什么行为,更确切地说。如果您需要一个默认命令,用户可以轻松地使用 docker runENTRYPOINT 覆盖,则最好使用 CMD 指令。如果您想定义一个具有特定可执行文件(如此处的 Python)的容器,然后如果您想覆盖它,则必须使用 entry-point 标志,例如 docker run -it --entrypoint /bin/bash IMAGE - dejanualex
那么考虑到我的命令不会改变,我应该使用 ENTRYPOINT 吗? - Shamoon

1
简短回答: 您的容器正在运行pipenv,而不是您的应用程序。 您需要修复最后一行。 CMD ["pipenv", "run", "python3", "application.py"]只应为CMD ["python3", "application.py"] 正确回答: 我完全同意没有使用pipenv的理由。更好的解决方案是将Dockfile替换为使用Python映像并忘记pipenv。 您已经在容器中,没有必要使用环境。

1
pipenv run 是使用正确的虚拟环境运行我的应用程序的命令。 - Shamoon
1
你不需要虚拟环境,因为你正在容器 Docker 中运行应用程序。如果你在一个隔离的容器中,为什么还想要隔离一个虚拟环境呢? - Gustavo Barros
@GustavoBarros 请看这里:https://github.com/pypa/pipenv/pull/2762#issue-209512016 - Dominic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接