Почему `chmod` заставляет` docker build` не хватать места на диске - PullRequest
0 голосов
/ 19 сентября 2019

так что моя сборка Docker по существу завершена, и мне просто нужно chown и chmod большой каталог рекурсивно.

Следующее является частью вывода из docker build:

Step 34/40 : RUN du -b -m -s / 2>/dev/null || true
 ---> Running in d261dfc7a9f8
1537    /
Removing intermediate container d261dfc7a9f8
 ---> 663d129f1487
Step 35/40 : RUN df --si -m /;df -i /;
 ---> Running in 8249096d3069
Filesystem     1M-blocks  Used Available Use% Mounted on
overlay            29674 28609      1066  97% /
Filesystem           Inodes  IUsed   IFree IUse% Mounted on
overlay             2737520 549839 2187681   21% /
Removing intermediate container 8249096d3069
 ---> fc4250e3433d
Step 36/40 : RUN chmod -R a+rwX /var/www/html
 ---> Running in 2705265de405
Error processing tar file(exit status 1): open /var/www/html/[...].php: no space left on device

Я решил свою проблему, запустив docker system prune -a, чтобы освободить лишние 908 МБ, но я не понимаю, почему дисковое пространство было проблемой в первую очередь (не говоря уже о том, что tar связано сэто ...).

Запуск watch df -m / Я ясно вижу, что chmod приводит к большим колебаниям в несколько 100 МБ (вниз и вверх), но это не делаетв любом случае, поскольку chmod не должен изменять распределение диска, даже с файлами CoW (копирование при записи) или разреженными файлами.

Почему реализация chmod докерами (я использую FROM centos:7.4.1708) вызывает дополнительный дискпространство для использования?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Слои файловой системы в Docker реализованы с помощью решения копирования при записи.Любое изменение файла приводит к тому, что сначала создается копия этого файла, а затем это изменение применяется к этой копии файла, даже к разрешению, владельцу или отметке времени.Команды chown и chmod при рекурсивном запуске изменят временные метки в файле, даже если разрешения не изменены.

Поэтому, чтобы минимизировать размер слоев в Docker, внесите все изменения в файл в одном слое.,Каждый шаг создает новый слой, поэтому объедините изменения в один шаг.С помощью команды COPY исправьте разрешения для источника и просмотрите параметры для настройки владельца.А с RUN вы часто будете видеть команды, связанные с синтаксисом &&, для сжатия в один шаг.Это особенно важно при создании временных файлов, поскольку вам необходимо удалить их до завершения шага, чтобы избежать записи их в слой изображения.

0 голосов
/ 19 сентября 2019

Это не chmod, что вызывает дополнительное дисковое пространство.Команда run в Dockerfile создает кэширование слоя, которое будет занимать ваше дисковое пространство.Я бы предложил объединить команды, которые вы запускаете, используя &&.

...