У меня есть этот 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
, здесь , если это интересно.Использование указанного скрипта не решило мою проблему (удаление контейнеров, изображений и томов не устранило зависание).Затем я удалил /var/lib/docker
и сбросил демон Docker, но все равно не повезло.
Любые рекомендации?
Обновление
Глядя на docker stats
, пока docker собирал мой Dockerfile, я увидел, что процент использования моего процессора постоянно превышал% 100 (как втысячи!).A 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, запись для этого Docker / образа в docker stats
исчезаети 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
Что я предполагаю, что я должен увидеть при выходе из сборки докера?Запустив 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
все еще показывает процесс).Что за?
Я не могу получить больше "deets" из битбейка, если нет флага, который мне не хватает.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-untar теперь завершен, но сборка все еще висит.Теперь, когда я делаю docker ps -a
, я вижу это:
3ea12a369089 22be583f7349 "/bin/sh -c '. ./oe-…" 2 hours ago Removal In Progress nifty_gauss
Интересно, подожду еще немного.
Ожидание окупилось .Образ докера довольно неуклюже успешно создан.
Почему для создания двоичного файла, основанного на плече, используется docker (примерно в 4 раза дольше, чем на той же машине без докера)?