即使使用简单的命令,docker build也非常慢

我在树莓派上构build了一个docker镜像,这当然需要一些时间。 这里的问题是,Dockerfile中的命令甚至非常简单,比如设置一个环境variables,在单个文件上使用chmod +x或者暴露端口80需要几分钟才能完成。

这里是我的Dockerfile的摘录:

 FROM resin/rpi-raspbian MAINTAINER felixbr <mymail@redacted.com> RUN export DEBIAN_FRONTEND=noninteractive && apt-get update && apt-get install -y python python-dev python-pip python-numpy python-scipy python-mysqldb mysql-server redis-server nginx dos2unix poppler-utils COPY requirements.txt /app/ RUN pip install -r /app/requirements.txt COPY . /app WORKDIR /app RUN cp /app/nginx-django.cfg /etc/nginx/sites-enabled/default RUN chmod +x /app/start.sh ENV DOCKERIZED="true" CMD ./start.sh EXPOSE 80 

请记住,这是使用ARMv6基础镜像,所以它可以在Raspberry Pi上运行,我正在使用Docker 1.5.0为Debra Raspberry Pi OS构build。

是为每个命令复制构build的层,还是为什么最后几个命令都需要几分钟才能完成?

Dockerfile每条指令都将在容器中运行。 这意味着每条指令都会执行以下操作:

  • 从上一步创build的图像中实例化一个容器,这将创build一个新的图层(R / W图层)
  • 做的事情(点安装等..)
  • 提交,将顶层作为图像层(我敢肯定它是复制图层)
  • 并删除容器(如果指定--rm选项)(因此,删除容器读/写层)

有几个I / O操作涉及到。 在SSD上,它非常快速,而且在一个好的硬盘上。 在Raspberry PI上构build时,如果将其构build在SD卡(或MicroSD)上,则SD卡的性能可能不太好。 这将取决于你的MicroSD的类,即使如此,我不认为这是真的好卡。 我做了一个简单的节点项目的尝试,它肯定花了几分钟,而不是像我的笔记本电脑上几秒钟。 这是硬件相关的(主要是SD卡的I / O,也许有点CPU,但…)。

您可能想尝试使用连接到树莓派的外部硬盘驱动器,并将泊坞窗文件夹移动到那里,以查看性能是否更好。

这是一个古老的问题,但作为参考,您可能一直在select存储驱动程序的痛苦。

在Ubuntu / Debian上,Docker默认使用AUFS存储驱动程序,速度非常快。 在其他发行版中,Docker默认使用一个devicemapper存储驱动程序,默认configuration(由于默认configuration了“loop-lvm”模式,而不是为了生产使用而重新推荐),这非常缓慢。

查看本指南以供参考,并了解如何在生产环境中configurationdevicemapper存储驱动程序(无循环模式): https : //docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/