Arm 即使使用简单的命令,docker构建也非常缓慢

Arm 即使使用简单的命令,docker构建也非常缓慢,arm,docker,Arm,Docker,我正在我的树莓皮上建立一个码头工人的形象,这当然需要一些时间。这里的问题是,即使Dockerfile中非常简单的命令,如设置环境变量、在单个文件上使用chmod+x或公开端口80,也需要几分钟才能完成 以下是我的Dockerfile摘要: FROM resin/rpi-raspbian MAINTAINER felixbr <mymail@redacted.com> RUN export DEBIAN_FRONTEND=noninteractive && apt-g

我正在我的树莓皮上建立一个码头工人的形象,这当然需要一些时间。这里的问题是,即使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
来自树脂/rpi拉斯宾
维护者felixbr
运行export DEBIAN_FRONTEND=noninteractive&&apt get update&&apt get install-y python python dev python pip python numpython scipy python mysqldb mysql server redis server nginx dos2unix poppler utils
复制requirements.txt/app/
运行pip安装-r/app/requirements.txt
抄袭/应用程序
WORKDIR/app
运行cp/app/nginx-django.cfg/etc/nginx/sites enabled/default
运行chmod+x/app/start.sh
ENV DOCKERIZED=“true”
CMD./start.sh
暴露80
请记住,这是使用一个
ARMv6
base映像,因此它可以在Raspberry Pi上运行,我使用的是为hypriot Raspberry Pi OS构建的docker 1.5.0


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

Dockerfile的每个指令都将在一个容器中运行。它的意思是,对于每个指令,它将执行以下操作:

  • 从上一步创建的图像实例化一个容器,这将创建一个新层(R/W层)
  • 完成任务(pip安装等)
  • 提交,它会将顶层复制为图像层(我很确定它正在复制该层)
  • 以及移除容器(如果指定了
    --rm
    选项)(因此,移除容器读/写层)
涉及到一些I/O操作。在SSD上,速度非常快,在好的硬盘上也是如此。当您在Raspberry PI上构建它时,如果您在SD卡(或MicroSD)上构建它,SD卡的性能可能不是那么好。这将取决于你们的级别,即使这样,我也不认为这对卡片有什么好处。我尝试了一个简单的节点项目,它肯定需要几分钟,而不是像在我的笔记本电脑上那样需要几秒钟。它与硬件相关(主要是SD卡的I/O,可能有一点CPU,但…)


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

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

在Ubuntu/Debian上,Docker默认使用AUFS存储驱动程序,速度相当快。 在其他发行版上,Docker默认使用devicemapper存储驱动程序,在默认配置下速度非常慢(由于默认配置为“loop lvm”模式,不建议在生产中使用)


查看本指南以供参考,并了解如何在生产环境中配置devicemapper存储驱动程序(无循环模式):

此处未提及的另一个注意事项是,在armv7上,您可能希望使用pip或apt get安装的大多数包都未打包为二进制文件

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

当您有一个包含大量依赖项的包,并且它们需要从源代码构建时,需要花费很长时间

您可以使用pip上的
-v
标志检查docker构建期间发生的事情


pip install-v-r requirements.txt

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

不会有太大帮助,但您可以将所有运行指令合并到一行,我考虑过这一点,它肯定会提高整体性能。但是,我没有解决ENV、EXPOSE、WORKDIR等同样糟糕的问题。目录中是否有不必要的文件?喜欢
.git
,因为它是git存储库。把它和其他任何东西添加到
.dockrignore
,你可能会注意到一个加速。我已经有了。构建上下文是5mb。我有相同的Dockerfile,只是有一个用于x86的ubuntu/trusty基本映像,即使它必须从复制开始,它也能在大约3秒钟内完成整个构建(在一个更好的maschine上,但仍然如此)。硬件的区别在于i5+ssd与四核ARM+micro sd卡。我不认为两者之间的差别应该达到几个数量级。这证实了我的怀疑。如果您可以指定docker存储容器和图像的位置,则外部硬盘驱动器会有所帮助。默认值为
/var/lib/docker/
。我在复制之前移动了常量命令,如ENV、EXPOSE和VOLUME,所以至少它们大部分时间都被缓存,这使它可以接受。是的。我在我的一台机器上这样做的方式是暂时禁用docker(并确保没有任何东西正在访问
/var/lib/docker
文件夹),将此文件夹移到外部驱动器(或者在我的情况下移到其他分区)上,然后执行绑定装载或装载(在
/etc/fstab
中指定)。