尝试使用Dockerfile构建Docker Image IT逐层执行,但是一旦达到PIP要求一层,就会产生回溯错误。搜索发现后,设置环境路径将解决该问题,但仍会出现相同的错误。
在Ubuntu 16.04和18.04中尝试了同样的尝试,但是在试图在面对此问题的Ubuntu Server(Lamb(中创建图像时。在虚拟框中运行Ubuntu Server OS。
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
不要将每个shell命令放在单独的运行中。它导致他们在较早的外壳的单独壳和环境变量中运行不会影响以后的变量,因为每个过程都有自己的环境。
RUN export PYTHONPATH=/usr/bin/python
&& pip install -r requirements.txt
另外,您可以使用临时分配语法设置变量并在一个命令中调用PIP:
RUN PYTHONPATH=/usr/bin/python pip install -r requirements.txt
拆分运行语句创建不必要的额外图层,从而导致过大图像。Dockerfiles中的标准练习是将相关的跑步合并为一个带有反弹的大命令。借助Apt-Get,最好在末尾删除APT的缓存文件,这样它们就不会成为层的一部分。
RUN apt-get update
&& apt-get install -y
swig
python-dev
libssl-dev
&& rm -rf /var/lib/apt/lists/*
顺便说一句,从线上不结合。当您写两个时,第二个赢了,第一个被忽略。
FROM ubuntu:16.04
FROM python:2
您可能认为您需要选择一个操作系统并在顶部添加Python,但这不是Docker图像的工作方式。Python:2图像已经下面有一个OS层。请记住,Docker图像是独立的捆绑包。当您拉入Python时:2您不仅会得到Python解释器,还可以获得所有依赖项。
- Python:2具有
FROM buildpack-deps:stretch
。 - buildpack-deps:Stretch具有
FROM buildpack-deps:stretch-scm
。 - buildpack-deps:strection-SCM具有
FROM buildpack-deps:stretch-curl
。 - buildpack-deps:strentage-curl具有
FROM debian:stretch
。
啊,就在那里。Debian是最终的基本图像。