Сборка Dockerfile зависает или занимает много времени? - PullRequest
0 голосов
/ 02 июля 2019

У меня есть этот 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 раза дольше, чем на той же машине без докера)?

1 Ответ

0 голосов
/ 11 июля 2019

Причина, по которой мой docker build занимал гораздо больше времени, чем выполнение команд на хосте напрямую, заключается в том, что после RUN, который выполняет команду bitbake, я не очищаю свой слой!

Как вы, возможно, знаете, каждая команда RUN является слоем, и каждый слой автоматически кэшируется docker, чтобы использовать его позже, если не произошло никаких изменений. Это означает, что docker должен собирать, удалять и кэшировать мой слой, включая все клонированное содержимое и все результаты / артефакты работы bitbake. Поэтому вместо того, чтобы докер боролся со всеми этими ненужными вещами, я удалил их вручную:

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 *

Обратите внимание на последние две команды bash в этом RUN (mv и rm).

Можно также удалить клонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...