精简适用于Python应用程序的Docker映像

时间:2019-03-25 14:11:58

标签: python docker

我开发了一个应在Docker容器中运行的python应用程序。一切进展顺利,容器和应用程序都运行良好。事实是,我只是想让docker容器第一次运行。从现在开始,我想改善我的docker映像。现在,我想通过删除不必要的依赖项来减小图像的大小。我的Dockerfile现在看起来像这样:

###############################################################
# Use the Ubuntu 16.04 as a base image
FROM ubuntu:16.04

###############################################################
# Update the dependencies in the image
RUN apt-get update && apt-get install locales
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8


###############################################################
# Install necessary overall dependencies
RUN apt-get update && apt-get install -y \
python3-dev \
python3-pip \
vim \
build-essential \
zlib1g-dev \ \
gfortran \
libblas-dev \
liblapack-dev \
libatlas-base-dev \
libzmq3-dev \
pkg-config \
libffi-dev \
libxml2 \
libxml2-dev \
zlib1g-dev \
libcairo-dev \
&& rm -rf /var/likb/apt/lists/*

###############################################################
# Install necessary Python dependencies
RUN pip3 install --upgrade pip
RUN pip3 install numpy==1.16.1
RUN pip3 install scipy
RUN pip3 install cython
RUN pip3 install pyzmq==17.0.0
RUN pip3 install utm
RUN pip3 install python-igraph==0.7.1post6
RUN pip3 install matplotlib==3.0.2
RUN pip3 install cycler==0.10.0
RUN pip3 install dill==0.2.8.2
RUN pip3 install kiwisolver==1.0.1
RUN pip3 install pyparsing==2.3.0
RUN pip3 install pyreadline==2.1
RUN pip3 install python-dateutil==2.7.5
RUN pip3 install scikit-learn==0.20.2
RUN pip3 install six==1.12.0
RUN pip3 install sklearn==0.0

我的docker映像的大小为1GB,仅用于python应用程序。我试图通过不将Ubuntu添加为映像来减小大小,而只使用python基本映像。每次我使用另一个基本映像时,都会收到未找到库或依赖项的错误。 也许您对我有一些技巧和窍门,以了解如何精简此python图像。 谢谢!

2 个答案:

答案 0 :(得分:1)

泊坞窗构建图像的方式是分层的。因此,Dockerfile中的每个命令(无论是RUN还是其他命令)都代表一个新层。

我发现减小映像大小的一个好方法是通过最小化Dockerfile中的层数。在您的情况下,一个好的开始可能是添加以下行:

RUN apt-get update && apt-get install locales

进入:

RUN apt-get update && apt-get install -y \
    python3-dev \
    python3-pip \
    vim \
    build-essential \
    zlib1g-dev \ \
    gfortran \
    libblas-dev \
    liblapack-dev \
    libatlas-base-dev \
    libzmq3-dev \
    pkg-config \
    libffi-dev \
    libxml2 \
    libxml2-dev \
    zlib1g-dev \
    libcairo-dev \
    && rm -rf /var/likb/apt/lists/*

这将确保在RUN命令末尾删除/ var / likb / apt / lists / *时,之前没有包含这些列表的层。

另外,由于您只想执行python脚本,因此值得寻找一个较小的基本映像,因为ubuntu:16.04中有很多功能您没有使用。例如,您可以使用官方的python图像python:$ version。

答案 1 :(得分:-1)

要改善docker映像,请减小映像大小,减少层数并在一层中进行安装/卸载。

###############################################################
# Use the Ubuntu 16.04 as a base image
FROM ubuntu:16.04

###############################################################
# Update the dependencies in the image
RUN apt-get update && apt-get install locales
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8


###############################################################
# Install necessary overall dependencies
RUN apt-get update && apt-get install -y \
python3-dev \
python3-pip \
vim \
build-essential \
zlib1g-dev \ \
gfortran \
libblas-dev \
liblapack-dev \
libatlas-base-dev \
libzmq3-dev \
pkg-config \
libffi-dev \
libxml2 \
libxml2-dev \
zlib1g-dev \
libcairo-dev \
\
\
&& pip3 install --upgrade pip \
&& pip3 install numpy==1.16.1 \
&& pip3 install scipy \
&& pip3 install cython \
&& pip3 install pyzmq==17.0.0 \
&& pip3 install utm \
&& pip3 install python-igraph==0.7.1post6 \
&& pip3 install matplotlib==3.0.2 \
&& pip3 install cycler==0.10.0 \
&& pip3 install dill==0.2.8.2 \
&& pip3 install kiwisolver==1.0.1 \
&& pip3 install pyparsing==2.3.0 \
&& pip3 install pyreadline==2.1 \
&& pip3 install python-dateutil==2.7.5 \
&& pip3 install scikit-learn==0.20.2 \
&& pip3 install six==1.12.0 \
&& pip3 install sklearn==0.0 \
\
\
&& apt-get remove -y \
python3-dev \
python3-pip \
vim \
build-essential \
zlib1g-dev \ \
gfortran \
libblas-dev \
liblapack-dev \
libatlas-base-dev \
libzmq3-dev \
pkg-config \
libffi-dev \
libxml2 \
libxml2-dev \
zlib1g-dev \
libcairo-dev \
&& rm -rf /var/likb/apt/lists/* \

另一种方法是使用docker multistage builder方法并在不同目录中安装python软件包,

###############################################################
# Use the Ubuntu 16.04 as a base image
FROM ubuntu:16.04 as sourceImage

###############################################################
# Update the dependencies in the image
RUN apt-get update && apt-get install locales
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8


###############################################################
# Install necessary overall dependencies
RUN apt-get update && apt-get install -y \
python3-dev \
python3-pip \
vim \
build-essential \
zlib1g-dev \ \
gfortran \
libblas-dev \
liblapack-dev \
libatlas-base-dev \
libzmq3-dev \
pkg-config \
libffi-dev \
libxml2 \
libxml2-dev \
zlib1g-dev \
libcairo-dev \
&& rm -rf /var/likb/apt/lists/*

###############################################################
# Install necessary Python dependencies
RUN pip3 install --install-option="--prefix=/opt/pip-packages"   --upgrade pip
RUN pip3 install --install-option="--prefix=/opt/pip-packages"   numpy==1.16.1 
RUN pip3 install --install-option="--prefix=/opt/pip-packages"   scipy
RUN pip3 install --install-option="--prefix=/opt/pip-packages"   cython
RUN pip3 install --install-option="--prefix=/opt/pip-packages"   pyzmq==17.0.0
RUN pip3 install --install-option="--prefix=/opt/pip-packages"   utm
RUN pip3 install --install-option="--prefix=/opt/pip-packages"   python-igraph==0.7.1post6
RUN pip3 install --install-option="--prefix=/opt/pip-packages"   matplotlib==3.0.2
RUN pip3 install --install-option="--prefix=/opt/pip-packages"   cycler==0.10.0
RUN pip3 install --install-option="--prefix=/opt/pip-packages"   dill==0.2.8.2
RUN pip3 install --install-option="--prefix=/opt/pip-packages"   kiwisolver==1.0.1
RUN pip3 install --install-option="--prefix=/opt/pip-packages"   pyparsing==2.3.0
RUN pip3 install --install-option="--prefix=/opt/pip-packages"   pyreadline==2.1
RUN pip3 install --install-option="--prefix=/opt/pip-packages"   python-dateutil==2.7.5
RUN pip3 install --install-option="--prefix=/opt/pip-packages"   scikit-learn==0.20.2
RUN pip3 install --install-option="--prefix=/opt/pip-packages"   six==1.12.0
RUN pip3 install --install-option="--prefix=/opt/pip-packages"   sklearn==0.0



FROM ubuntu:16.04 
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8

ENV PYTHONPATH=$PYTHONPATH:/opt/python-packages

COPY --from=sourceImage /opt/pip-packages/ /opt/python-packages

#### install system required packages, if needed
RUN apt-get update && apt-get install -y \
vim \
gfortran \
pkg-config \
libxml2 \
&& rm -rf /var/likb/apt/lists/*