<p>这是我最终采用的解决方案,我们的应用程序已经在生产中运行了近一个月,没有任何问题,并已安装了此修复程序:</p>
<p>我要做的就是</p>
<p><code>--ignore-installed</code></p>
<p>我的dockerfile中引起错误的<code>pip install</code>行。使用我最初问题中的相同dockerfile示例,固定dockerfile看起来像:</p>
<pre><code>FROM ubuntu:14.04
RUN apt-get -y update && apt-get -y install \
python-pip \
python-numpy # ...and many other packages
RUN pip install -U pip
RUN pip install -r /tmp/requirements1.txt --ignore-installed # don't try to uninstall existing packages, e.g., numpy
RUN pip install -r /tmp/requirements2.txt
RUN pip install -r /tmp/requirements3.txt
</code></pre>
<p>我能找到的关于<code>--ignore-installed</code>的文档在我看来是不清楚的(<code>pip install --help</code>只是说“忽略已安装的包(而是重新安装)。”),我询问了这个标志<a href="https://stackoverflow.com/q/49932926/3642398">here</a>的潜在危险,但还没有得到令人满意的答案。但是,如果有任何负面影响,我们的生产环境还没有看到它们的影响,我认为风险很低/没有(至少这是我们的经验)。我能够确认,在我们的例子中,当使用这个标志时,没有卸载现有的安装,但是总是使用较新的安装。</p>
<h2>更新:</h2>
<p>我想强调一下@ivan戡u pozdeev的<a href="https://stackoverflow.com/questions/53807511/pip-cannot-uninstall-package-it-is-a-distutils-installed-project/53807588#53807588">this</a>回答。他提供了一些答案中没有的信息,他还概述了我的解决方案的一些潜在副作用。</p>