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

时间:2015-05-01 11:39:49

标签: arm docker

我正在我的Raspberry Pi上构建一个docker镜像,这当然需要一些时间。这里的问题是,即使是Dockerfile中非常简单的命令,比如设置环境变量,在单个文件上使用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上运行,而我正在使用为低级Raspberry Pi OS构建的docker 1.5.0。

是否为每个命令复制构建的图层,或者为什么最后几个命令中的每一个都需要几分钟才能完成?

4 个答案:

答案 0 :(得分:6)

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

  • 从上一步创建的图像中实例化一个容器,这将创建一个新图层(R / W图层)
  • 做事(pip install等)。
  • 提交,将顶层复制为图像层(我很确定它正在复制图层)
  • 删除容器(如果指定了--rm选项)(因此,删除容器读/写层)

涉及一些I / O操作。在SSD上,它非常快,以及在良好的硬盘上。当你在Raspberry PI上构建它时,如果你在SD卡(或MicroSD)上构建它,SD卡的性能可能就不那么好了。这将取决于你的MicroSD类,即便如此,我也不认为这对卡非常好。我尝试了一个简单的节点项目,它肯定需要几分钟而不是几秒钟,就像我在笔记本电脑上做的那样。它与硬件有关(主要是SD卡的I / O,可能是CPU的一小部分,但是......)。

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

答案 1 :(得分:2)

这是一个老问题,但作为参考,您可能已经遭受所选存储驱动程序的困扰。

在Ubuntu / Debian上,Docker默认使用AUFS存储驱动程序,这非常快。 在其他发行版中,Docker默认使用devicemapper存储驱动程序,默认配置非常慢(由于&#34; loop-lvm&#34;模式,默认配置,而不是生产使用的推荐)。 / p>

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

答案 2 :(得分:0)

这里没有提到的另一个考虑因素是,在armv7上,您可能希望通过pip或apt-get安装的大多数软件包都没有打包为二进制文件。

这意味着在amd64架构上,pip install下载二进制文件,只是将其复制到正确的位置,但是在armv7上,它将找不到合适的二进制文件,而是下载源代码,并且需要从头开始构建它。

当您的程序包具有很多依赖项并且需要从源代码构建它们时,这将花费很长的时间。

您可以使用pip上的-v标志来检查docker构建过程中发生的事情

pip install -v -r requirements.txt

答案 3 :(得分:0)

在 Arm/v7 arch 上,一些 python 库还没有准备好作为二进制文件,构建时间很长,因为您也在为 armV7 构建库。