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
Python Heroku容器:push始终重新安装conda软件包_Python_Heroku_Docker_Anaconda - Fatal编程技术网

Python Heroku容器:push始终重新安装conda软件包

Python Heroku容器:push始终重新安装conda软件包,python,heroku,docker,anaconda,Python,Heroku,Docker,Anaconda,为了在Python上创建自己的ML服务器,我遵循了前面的步骤,它利用Anaconda及其包 一切似乎都正常,但每次我都希望通过输入更新位于/webapp的脚本 heroku container:push 执行了pip(或者更确切地说,是Conda)依赖项的完全重新安装,这需要相当长的时间,而且对我来说似乎不合逻辑。我对Docker和Heroku框架的理解都非常不稳定,因此我还没有找到一个解决方案,允许我在离开容器时只推送代码,而不(重新?)上传整个图像 Dockerfile: FROM her

为了在Python上创建自己的ML服务器,我遵循了前面的步骤,它利用Anaconda及其包

一切似乎都正常,但每次我都希望通过输入更新位于/webapp的脚本

heroku container:push
执行了pip(或者更确切地说,是Conda)依赖项的完全重新安装,这需要相当长的时间,而且对我来说似乎不合逻辑。我对Docker和Heroku框架的理解都非常不稳定,因此我还没有找到一个解决方案,允许我在离开容器时只推送代码,而不(重新?)上传整个图像

Dockerfile:

FROM heroku/miniconda

ADD ./webapp/requirements.txt /tmp/requirements.txt

RUN pip install -qr /tmp/requirements.txt

ADD ./webapp /opt/webapp/ 
WORKDIR /opt/webapp

RUN conda install scikit-learn  
RUN conda install opencv

CMD gunicorn --bind 0.0.0.0:$PORT wsgi

这是因为一旦更新了webapp目录,生成缓存就会失效。这条线之后的任何东西都需要重建

构建映像时,Docker会逐步完成Dockerfile中的指令,并按指定的顺序执行每个指令。在检查每条指令时,Docker在其缓存中查找可以重用的现有映像,而不是创建新的(重复的)映像

缓存失效后,所有后续Dockerfile命令都会生成新图像,并且缓存不会被使用。()

因此,为了利用构建缓存,Dockerfile需要定义如下

FROM heroku/miniconda

RUN conda install scikit-learn opencv

ADD ./webapp /opt/webapp/
RUN pip install -qr /opt/webapp/requirements.txt

WORKDIR /opt/webapp

CMD gunicorn --bind 0.0.0.0:$PORT wsgi

您应该将两个RUN conda命令合并到一个语句中,以便在图像中显示。另外,将ADD合并到单个命令中,并从其他目录运行pip要求。

在添加自己的应用程序代码之前,您是否尝试过移动conda安装?这将允许Docker缓存前面的步骤。@jonrsharpe不,我没有,我现在就试试,thanks@jonrsharpe好吧,起初我认为它兑现了一些依赖项,但每次我重新推送容器时,我都会收到以下几行消息,告诉我docker正在否定某些层
推送指的是存储库[registry.heroku.com/vast-atol-16962/web]feaddc106e8f:推送308eb1682146:推送3b47486c7c31:推送6da4924dc20a:推送22.06MB/671.2MB 8cf51ea9d6c7:层已存在f8cb04ba66b3:层已存在c3a60968b69b:层已存在b3fcd0717ee4:层已存在d1e125eef73f:层已存在9e63c5bce458:层已存在
层已存在良好新闻,这意味着它正在查找缓存的版本。如果上一层中的一层已被修改,Docker将无法缓存后续层。如果您的
package.json
和/或您的应用程序发生更改,则
复制..
后的每条指令都将重新执行。@koral您检查过我的建议了吗?