我正在通过docker-compose用几个docker镜像构建一个webapp。
Docker映像之一是webserver_web。
图片的大小(〜1.2 GB)对我来说看起来很大,我想知道我可以采用什么技巧来减小大小。
我怀疑我没有有效地使用Dockerfile。
有关层大小的观察:
FROM python:3.7.6
。python 3.7.6
图片的大小为919MB 图像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
答案 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,不是一个大胜利。