Dockerfile的构建挂起或花费很长时间?

时间:2019-07-01 23:05:36

标签: docker dockerfile

我有这个Dockerfile:

FROM fedora:28

# create new user
RUN adduser --home /home/rpi-user rpi-user

# install things needed for yocto
RUN dnf -y install make wget bzip2 python unzip perl patch \
     diffstat git cpp gcc gcc-c++ glibc-devel texinfo chrpath \
     ccache perl-Data-Dumper perl-Text-ParseWords perl-Thread-Queue socat \
     findutils which SDL-devel xterm cpio file hostname rpcgen

# run the commands that follow as rpi-user
USER rpi-user

# clone yocto/poky and raspberrypi layer
RUN git clone git://git.yoctoproject.org/poky /home/rpi-user/poky
RUN cd /home/rpi-user/poky; git clone https://github.com/agherzan/meta-raspberrypi.git

# set up oe build environment and add meta-raspberrypi to bblayers.conf
# modify machine name and add options to local.conf
WORKDIR /home/rpi-user/poky
ENV LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 LANGUAGE=en_US.UTF-8
COPY local.conf.append /tmp/
RUN ls -l
RUN . ./oe-init-build-env rpi-build; \
        cd conf; perl -0777 -pi -e 's/(BBLAYERS \?= "Provided more updates.[^"]*)"/\1\/home\/rpi-user\/poky\/meta-raspberrypi \\\n  "/g' bblayers.conf; \
        sed -i 's/\(MACHINE ??= \).*$/\1"raspberrypi3"/g' local.conf; \
        cat /tmp/local.conf.append >> local.conf; \
        cd ../; bitbake -DDDv rpi-basic-image;
RUN echo "[!] Build complete."

执行docker build -t bla/rpi .会使我的终端挂起(最后6行):

NOTE: Running noexec task 3294 of 3294 (/home/rpi-user/poky/meta-raspberrypi/recipes-core/images/rpi-basic-image.bb:do_build)
DEBUG: Teardown for bitbake-worker
DEBUG: Teardown for bitbake-worker
NOTE: Tasks Summary: Attempted 3294 tasks of which 5 didn't need to be rerun and all succeeded.

Summary: There were 5 WARNING messages shown.

直接在同一台计算机上的终端上运行完全相同的命令,我可以在不挂起的情况下构建映像。仅当使用docker(且仅此特定Dockerfile)时,我的构建才会挂起。我几乎可以确定这与内存有关。

我通常使用脚本删除基本上由docker rmi <images>docker rm <containers>docker system prune --volumes -fhere组成的docker剩余物。使用上述脚本无法解决我的问题(删除容器,图像和卷无法解决挂起问题)。然后,我删除了/var/lib/docker并重置了docker daemon,但是仍然没有运气。

有什么建议吗?

更新

在docker构建我的Dockerfile的过程中,看着docker stats,我发现我的cpu使用率一直超过%100(就像成千上万!)。 dmesg -w显示如下消息:

[ 4409.558822] mce: CPU1: Core temperature above threshold, cpu clock throttled (total events = 3471)
[ 4409.558823] mce: CPU7: Core temperature above threshold, cpu clock throttled (total events = 3471)
[ 4409.558825] mce: CPU0: Package temperature above threshold, cpu clock throttled (total events = 4603)
[ 4409.558826] mce: CPU6: Package temperature above threshold, cpu clock throttled (total events = 4603)

更有趣的是,在docker stats运行时,当docker build挂起时,docker stats中该docker / image的条目消失了,dmesg显示:

[ 4701.032315] docker0: port 1(veth0ef04d2) entered disabled state
[ 4701.032481] veth2578e04: renamed from eth0
[ 4701.130810] docker0: port 1(veth0ef04d2) entered disabled state
[ 4701.135113] device veth0ef04d2 left promiscuous mode
[ 4701.135137] docker0: port 1(veth0ef04d2) entered disabled state

我认为在退出docker构建后应该看到什么?运行ps aux | grep -i docker,我仍然看到该进程正在运行:

<user>    6281  0.9  0.1 1961860 27800 pts/1   Sl+  09:17   0:35 docker -D build -t bam/rpi .

因此,似乎docker认为构建已完成(docker stats删除了相应的条目),但是linux仍然看到docker构建正在运行(ps aux仍显示该过程)。什么啊

除非有我遗漏的标志,否则我无法从bitbake中获得更多的“信号”。 docker stats没有出现我所期望的任何内存问题。

哇,很明显docker ps -a表示容器也已经退出(与docker stats一致):

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
3ea12a369089        22be583f7349        "/bin/sh -c '. ./oe-…"   About an hour ago   Exited (0) 13 minutes ago                       nifty_gauss

我认为它再有趣不过了。在我的ps aux | grep -i docker中,我看到了一个有趣的过程:

root      7775 19.2  1.1 2170612 181216 ?      Sl   10:13   4:04 docker-untar /var/lib/docker/overlay2/f3aade16d0d44ef61037ca5fc7ac0690f66b1894578141add2197fe7f8cdd402/diff

那是什么?它能使东西脱皮吗?那可能要花一些时间。也许我应该再等一下这个挂起(我会)。此过程的stat列不断地从Rl变为Sl并返回。很奇怪。

所以我等了。 docker-unar进程现在消失了,但是构建仍然挂起。现在,当我执行docker ps -a时,我会看到:

3ea12a369089        22be583f7349        "/bin/sh -c '. ./oe-…"   2 hours ago         Removal In Progress                           nifty_gauss

有趣,还会再等。

等待中的回报。泊坞窗映像相当笨拙地成功构建。

为什么使用docker需要这么长时间(比在docker上运行大约要长四倍) 同一台没有docker的机器)来构建基于arm的二进制文件?

1 个答案:

答案 0 :(得分:0)

我的docker build比直接在主机上执行命令花费更多时间的原因是,在执行RUN命令的bitbake之后,我没有清理我的层!

您可能知道,每个RUN命令都是一个图层,docker将自动缓存每个图层,以便在以后不进行任何更改时使用。这意味着docker必须压缩,删除和缓存我的图层,包括所有克隆的内容以及运行bitbake的所有输出/工件。因此,与其让docker摆脱所有不必要的麻烦,我还是手动将其删除:

RUN . ./oe-init-build-env rpi-build && \
        cd conf && perl -0777 -pi -e 's/(BBLAYERS \?= "[^"]*)"/\1\/home\/rpi-user\/poky\/meta-raspberrypi \\\n  "/g' bblayers.conf && \
        sed -i 's/\(MACHINE ??= \).*$/\1"raspberrypi3"/g' local.conf && \
        cat /tmp/local.conf.append >> local.conf && \
        cd ../ && bitbake -DDDDvvv rpi-basic-image && mv tmp/deploy /home/rpi-user/ && rm -rf *

请注意此RUN中的最后两个bash命令(mvrm)。

也可以删除克隆。