我有这个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 -f
,here组成的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的二进制文件?
答案 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命令(mv
和rm
)。
也可以删除克隆。