我正在通过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镜像的大小?

    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
    

    最佳答案

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

    TL; DR;

    Python图像很大。越大越快。越小越慢。 1GB对于python镜像来说不是很大。

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

  • https://pythonspeed.com/articles/base-image-python-docker-images/
  • https://pythonspeed.com/articles/base-image-python-docker-images/
  • https://towardsdatascience.com/slimming-down-your-docker-images-275f0ca9337e


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

    10-07 19:27
    查看更多