Фон
Я пытаюсь создать образ докера из Dockerfile на виртуальной машине. Виртуальная машина работает под управлением Redhat 7.1 (ядро 3.10) и Docker 1.10.2.
Dockerfile имеет следующий контент
FROM rhel
MAINTAINER MyName<[email protected]>
RUN #yum install wget and other tools (less than 500 MB)
COPY entitlementfile /opt/entitlementfile
RUN wget -O /opt/installer.bin https://installer.com/installer.bin \
&& chmod +x /opt/* \
&& /opt/installer.bin --quiet \
&& rm -f /opt/*.bin
USER admin
На моей виртуальной машине сборки доступно около 16 ГБ свободного места.
[root@xrh701 DockerImage]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 2.1G 16G 12% /
...
Установщик работает в диапазоне 3G, а установленный пакет — в диапазоне 8G. Это в сумме составляет максимум 11 ГБ, что немного превышает размер базового устройства докера по умолчанию, который составляет 10 ГБ.
Поэтому я вручную запускаю демон docker с большим dm.size (15G), чтобы обойти эту проблему.
docker daemon --storage-opt dm.basesize=15G
Поскольку докер основан на Union FS, образы накладываются друг на друга. Так что я понимаю, что
(1) максимальный размер, который мог получить мой образ, составляет 11 ГБ (установщик в один слой 3 ГБ, а слой пакета, добавленный поверх 8 ГБ)
(2) и если я wget установщик, запускаю его, затем удаляю установщик той же командой RUN, образ должен быть только 8G (так как установщик 3G удаляется)
В любом случае, суть в том, что 16G места должно быть более чем достаточно.
Проблема
Но мое текущее наблюдение заключается в том, что во время процесса сборки докера он всегда зависал, так как использовал все доступные места.
[root@xrh701 DockerImage]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 18G 20K 100% /
...
я вижу две картинки
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> fa09e98656ba About an hour ago 258.1 MB
rhel latest 32f8a1d5f019 9 days ago 203.2 MB
«docker inspect» показывает, что изображение ‹ none > является промежуточным изображением после COPY файла прав.
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
232245023f90 fa09e98656ba "/bin/sh -c 'wget -O " About an hour ago Exited (0) About an hour ago lonely_curie
Этот промежуточный контейнер завершил строку RUN wget, успешно завершил работу, но не зафиксировал образ докера из-за нехватки места.
Что еще хуже, я не могу ни удалить контейнер, ни удалить /var/lib/docker, чтобы восстановить место обратно
# docker rm -f lonely_curie
Failed to remove container (lonely_curie): Error response from daemon: Driver devicemapper failed to remove root filesystem 232245023f90b42a4dbd19a78bf32836f9f8618d7dbcba54159c3df029b5b114: mount still active
Вопрос
Почему докер израсходовал все пространство? Согласно расчетам, места на диске (16G) должно быть более чем достаточно для целевого образа (8G). [Эта виртуальная машина принадлежит мне, поэтому я могу гарантировать, что никто другой или какой-либо другой процесс не использует место на жестком диске]
Как принудительно удалить контейнер в моей текущей ситуации, чтобы восстановить пространство?
Как мне собрать этот образ 8G (или образ 11G, если считать установщик) на виртуальной машине 16G? Если это невозможно, каково минимальное пространство для его успешного создания? В настоящее время я подаю заявку на виртуальную машину 32G из лаборатории.
docker ps -a
... но я все еще не могу удалить /var/lib/docker, так как он все еще жалуется, что устройство и ресурс заняты - person cookieisaac   schedule 11.03.2016