尝试使用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
答案 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解释器,而且会获得所有依赖项。
FROM buildpack-deps:stretch
。FROM buildpack-deps:stretch-scm
。FROM buildpack-deps:stretch-curl
。 FROM debian:stretch
。啊,在那里。 Debian是最终的基础映像。