如何优化Docker镜像?

时间:2020-06-02 06:52:55

标签: docker


我正在通过docker-compose用几个docker镜像构建一个webapp。
Docker映像之一是webserver_web。
图片的大小(〜1.2 GB)对我来说看起来很大,我想知道我可以采用什么技巧来减小大小。
我怀疑我没有有效地使用Dockerfile。

有关层大小的观察:

  • webserver_web图像在第一层使用FROM python:3.7.6
  • python 3.7.6图片的大小为919MB
  • 历史上共有34层(“ IMAGE”列)
  • 前18层的总大小约为918MB(适合python 3.7.6图像的大小)
  • 第19个映像对应于Dockerfile中的第二个命令(“ MAINTAINER User4”)
  • 前18个图像来自Dockerfile中的第一个命令(“ FROM python:3.7.6”)
  • 图像的剪切大小(约80%)来自python图像
  • 基本图片对整体图片尺寸的贡献:〜80%(918 / 1136.64)
  • 图像webserver_web的大小:1136.64 MB(1.11 * 1024)

  • 58.2MB来自需要将sudo, vim, and nano安装到容器中:
    RUN apt-get update && apt-get install -y vim nano sudo

以下是映像大小,Dockerfile和docker映像的层。

有什么想法可以减少webserver_web Docker映像的大小?

码头图像是否可以接受超过1GB的大小?

谢谢,
阿夫纳


图像尺寸:

docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
...
webserver_web                latest              ec306049da3e        15 minutes ago      1.11GB
python                       3.7.6               879165535a54        3 months ago        919MB

Dockerfile:

cat Dockerfile
FROM python:3.7.6
MAINTAINER User4 <user4@gmail.com>

# Create the group and user to be used in this container
RUN groupadd flaskgroup && useradd -m -g flaskgroup -s /bin/bash flask

RUN apt-get update && apt-get install -y vim nano sudo

# http://gbraad.nl/blog/non-root-user-inside-a-docker-container.html
# Add user flask to sudoers
RUN echo "flask ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/flask && \
    chmod 0440 /etc/sudoers.d/flask

# Create the working directory (and set it as the working directory)
RUN mkdir -p /home/flask/app/web
WORKDIR /home/flask/app/web

# Install the package dependencies (this step is separated
# from copying all the source code to avoid having to
# re-install all python packages defined in requirements.txt
# whenever any source code change is made)
COPY requirements.txt /home/flask/app/web
RUN pip install --no-cache-dir -r requirements.txt

# Copy the source code into the container
COPY . /home/flask/app/web

RUN chown -R flask:flaskgroup /home/flask

USER flask

docker映像的层(每层大小):

avner@avner-ThinkPad-P51:~$ docker history webserver_web
IMAGE               CREATED              CREATED BY                                      SIZE                COMMENT
0688e195012d        About a minute ago   /bin/sh -c #(nop)  USER flask                   0B                  
3052d2e91fd0        About a minute ago   /bin/sh -c chown -R flask:flaskgroup /home/f…   35.3MB              
81a5cf0a37b9        About a minute ago   /bin/sh -c #(nop) COPY dir:668861ff8c7f55004…   35.3MB              
24341ee304ae        About a minute ago   /bin/sh -c pip install --no-cache-dir -r req…   64.2MB              
925e12e74fe8        About a minute ago   /bin/sh -c #(nop) COPY file:4e7a69dabf52b355…   1.07kB              
0419bbb589d3        About a minute ago   /bin/sh -c #(nop) WORKDIR /home/flask/app/web   0B                  
b87691531f4a        About a minute ago   /bin/sh -c mkdir -p /home/flask/app/web         0B                  
251001545b6f        About a minute ago   /bin/sh -c echo "flask ALL=(root) NOPASSWD:A…   30B                 
980fc4c0dd9c        About a minute ago   /bin/sh -c apt-get update && apt-get install…   58.2MB              
9015bd3d1e3b        2 minutes ago        /bin/sh -c groupadd flaskgroup && useradd -m…   334kB               
7ad23eec9ab4        2 minutes ago        /bin/sh -c #(nop)  MAINTAINER User4 <user4@g…   0B                  
879165535a54        3 months ago         /bin/sh -c #(nop)  CMD ["python3"]              0B                  
<missing>           3 months ago         /bin/sh -c set -ex;   wget -O get-pip.py "$P…   6.34MB              
<missing>           3 months ago         /bin/sh -c #(nop)  ENV PYTHON_GET_PIP_SHA256…   0B                  
<missing>           3 months ago         /bin/sh -c #(nop)  ENV PYTHON_GET_PIP_URL=ht…   0B                  
<missing>           4 months ago         /bin/sh -c #(nop)  ENV PYTHON_PIP_VERSION=20…   0B                  
<missing>           4 months ago         /bin/sh -c cd /usr/local/bin  && ln -s idle3…   32B                 
<missing>           4 months ago         /bin/sh -c set -ex   && wget -O python.tar.x…   91MB                
<missing>           4 months ago         /bin/sh -c #(nop)  ENV PYTHON_VERSION=3.7.6     0B                  
<missing>           4 months ago         /bin/sh -c #(nop)  ENV GPG_KEY=0D96DF4D4110E…   0B                  
<missing>           4 months ago         /bin/sh -c apt-get update && apt-get install…   17.9MB              
<missing>           4 months ago         /bin/sh -c #(nop)  ENV LANG=C.UTF-8             0B                  
<missing>           4 months ago         /bin/sh -c #(nop)  ENV PATH=/usr/local/bin:/…   0B                  
<missing>           4 months ago         /bin/sh -c set -ex;  apt-get update;  apt-ge…   510MB               
<missing>           4 months ago         /bin/sh -c apt-get update && apt-get install…   145MB               
<missing>           4 months ago         /bin/sh -c set -ex;  if ! command -v gpg > /…   17.5MB              
<missing>           4 months ago         /bin/sh -c apt-get update && apt-get install…   16.5MB              
<missing>           4 months ago         /bin/sh -c #(nop)  CMD ["bash"]                 0B                  
<missing>           4 months ago         /bin/sh -c #(nop) ADD file:a5ec219cbfc4e0c31…   114MB 

2 个答案:

答案 0 :(得分:0)

大多数时候,python docker镜像很大。如果要缩小图像,可以使用multistage builds。但这会减慢您的构建时间。另外,您可以缩小图像中的图层(例如,不要使用多个RUN语句,而是使用一次并在一条语句中执行所有操作)。但是,这将使几乎所有docker缓存机制失效。而且它将大大增加构建时间。

TL; DR;

Python图像很大。越大越快。越小越慢。对于python映像,1GB的空间不是很大。

我强烈推荐此链接用于python docker映像:


我在“越大越快。越小越慢”中提到构建时间。。我推荐这个article关于docker映像大小。实际上,使网络具有看起来很大的图像(具有多个层的图像)并不是很大的开销。仅在第一次上传时才是开销。之后,由于注册表/服务器中的层缓存,所有小的更改将很小。如果使用多阶段,则修剪/清除或压缩图像会较小。但是,即使您稍作更改,它也会从一开始就上传几乎所有图层(因为图像中的图层数量很少)。因此,如果您经常更改图像,则较大的图像会减少带宽使用。但是,如果您不经常更改图片,请使其尽可能小(最后删除未使用的工具,分段,最后一阶段使用最少的陈述)。

答案 1 :(得分:0)

您没有太多选择,最后从919 MB映像开始,MAINTAINER User4 ...之前的所有层都是python:3.7.6层。也许只安装vim或nano,不是一个大胜利。