Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为Flask应用程序运行带有Python3.7和Pipenv的Docker容器?_Python_Docker_Flask - Fatal编程技术网

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

如何为Flask应用程序运行带有Python3.7和Pipenv的Docker容器?,python,docker,flask,Python,Docker,Flask,我的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

我的
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烧瓶样本运行它,看起来还可以

但是当我进入
http://localhost:5000
,不加载任何内容。我做错了什么?

简短回答: 您的容器正在运行pipenv,而不是您的应用程序。你需要修好最后一行。 CMD[“pipenv”、“run”、“python3”、“application.py”]应仅为CMD[“python3”、“application.py”]

正确答案:
我完全同意没有任何理由使用pipenv。更好的解决方案是将您的Dockfile替换为使用python映像,然后忘记pipenv。您已经在容器中,没有理由使用环境。

为什么需要虚拟环境?为什么使用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。 构建图像:
docker build-t dejdej/flasky:最新版本。

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

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


pipenv run
是在正确的虚拟环境下运行我的应用程序的工具。在容器docker中运行应用程序时,不需要虚拟环境。如果你在一个隔离的容器中,为什么要隔离一个虚拟环境呢?
-it
有什么作用?-i=即使没有连接也保持STDIN打开,-t=分配一个伪tty它与-d(分离)相反,如果你在反循环(-d)中运行容器,那么调试会有点困难我应该使用
ENTRYPOINT
还是
CMD
?更确切地说,这取决于您想要的行为
CMD
是一条最好的指令,如果您需要一个默认命令,用户可以使用
docker run
ENTRYPOINT
轻松覆盖该命令,如果您想在本例中定义一个具有特定可执行文件(如python)的容器,之后,如果您想覆盖它,您必须使用入口点标志,例如,
docker run-it--entrypoint/bin/bash IMAGE
,因此如果我的命令不会更改,我可能应该使用
entrypoint
?一个常见的原因是您的Flask应用程序监听容器私有本地主机地址;您将看到
在上运行http://127.0.0.1:5000/
在容器日志中,如果您看到这一点,您将无法从外部到达容器。更详细地描述了这一点。如果这没有帮助,那么查看实际的容器日志和足够的应用程序源代码来重现问题将是有用的。

FROM python:2.7

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

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