命令'/ bin / sh -c pip install -r requirements.txt'返回非零代码:1

时间:2019-05-15 09:47:00

标签: python docker pip dockerfile

尝试使用Dockerfile构建docker映像时,它会正确地逐层执行,但是一旦达到pip要求层,就会产生回溯错误。搜索发现设置环境路径可以解决该问题,但仍然会出现相同的错误。

在ubuntu 16.04和18.04中尝试相同的方法可以正常工作。但是,当尝试在ubuntu服务器(lamb)中创建映像时,会遇到此问题。 在Virtual Box中运行ubuntu服务器操作系统。

Dockerfile:

FROM ubuntu:16.04
 FROM python:2
 RUN mkdir /app
 WORKDIR /app
 RUN apt-get update
 RUN apt-get install -y swig
 RUN apt-get install -y python-dev
 RUN apt-get install -y libssl-dev
 COPY . /app/
 RUN export PYTHONPATH=/usr/bin/python
 RUN pip install -r requirements.txt
 CMD ["python", "manage.py", "runserver", "0.0.0.0:5000"]

构建Docker映像:

Step 1/13 : FROM ubuntu:16.04
  ---> a06c3a7d3393
 Step 2/13 : FROM python:2.7-slim
  ---> e1e8909cd647
 Step 3/13 : WORKDIR /app
 ---> Using cache
 ---> 90810681a80b
Step 4/13 : RUN apt-get update
 ---> Using cache
 ---> 6d4bb0a65e78
Step 5/13 : RUN apt-get install -y swig
 ---> Using cache
 ---> e58beadc9492
Step 6/13 : RUN apt-get install -y python-dev
 ---> Using cache
 ---> 87eb4aa77601
Step 7/13 : RUN apt-get install -y libssl-dev
 ---> Using cache
 ---> ed7cd728dce6
Step 8/13 : COPY . /app
 ---> 991b213ee62a
Step 9/13 : ENV PYTHONPATH "${PYTHONPATH}:/usr/bin/python"
 ---> Running in 2a52a53a2190
Removing intermediate container 2a52a53a2190
 ---> 21a5000cb6cc
Step 10/13 : RUN pip install -r requirements.txt
 ---> Running in 7fa6749748ca
Traceback (most recent call last):
  File "/usr/local/bin/pip", line 6, in <module>
from pip._internal import main
  File "/usr/local/lib/python2.7/site-packages/pip/_internal/__init__.py", line 5, in <module>
import logging
  File "/usr/local/lib/python2.7/logging/__init__.py", line 26, in <module>
import sys, os, time, cStringIO, traceback, warnings, weakref, collections
  File "/usr/local/lib/python2.7/weakref.py", line 14, in <module>
from _weakref import (
ImportError cannot import name _remove_dead_weakref
The command '/bin/sh -c pip install -r requirements1.txt' returned a non-zero code: 1

1 个答案:

答案 0 :(得分:0)

不要将每个shell命令放在单独的RUN中。这会导致它们在单独的shell中运行,而较早的shell的环境变量不会影响以后的shell,因为每个进程都有自己的环境。

RUN export PYTHONPATH=/usr/bin/python \
 && pip install -r requirements.txt

或者,您可以使用临时赋值语法来设置变量并在一个命令中调用pip:

RUN PYTHONPATH=/usr/bin/python pip install -r requirements.txt

Split RUN语句会创建不必要的额外图层,从而导致图像过大。 Dockerfiles中的标准做法是将相关的RUN合并为一个带有反斜杠的大命令。使用apt-get,最好也erase apt's cache files at the end,使它们不成为该层的一部分。

RUN apt-get update \
 && apt-get install -y \
        swig \
        python-dev \
        libssl-dev \
 && rm -rf /var/lib/apt/lists/*

顺便说一下,FROM行不会合并。当您编写其中两个时,第二个将获胜,第一个将被忽略。

FROM ubuntu:16.04
FROM python:2

您可能认为您需要选择一个操作系统并在其顶部添加python,但这并不是Docker映像的工作方式。 python:2图像下面已经有一个OS层。请记住,Docker映像是独立的捆绑包。当您插入python:2时,您不仅会获得Python解释器,而且会获得所有依赖项

啊,在那里。 Debian是最终的基础映像。