Intereting Posts
Как проверить, существует ли изображение Docker с определенным тегом локально? Мне нужно запустить много серверов apache2.0 в разных контейнерах докеров и указать каждый номер порта Использование среды докеров -e переменная в супервизоре Ошибка 502 при просмотре приложения с поддержкой Java libemix с использованием Docker container Томов тонера не существует для контейнера данных в 1.9.1 Ошибка при загрузке модуля psycopg2 при установке с «колеса» установка псевдо-tty в контейнер-докер Невозможно использовать файл .env с docker-compose Ошибка копирования файла для экземпляра Docker Docker – как монтировать папку внутри запущенного контейнера в качестве тома в другой запущенный контейнер? Управление процессом докеров Как я могу сделать docker-compose привязать контейнеры только к определенной сети вместо 0.0.0.0? Docker-compose и несовместимость Xvfb? Докер снижает или уменьшает потребность в Puppet / Chef et al? Док-станция MacOS, зависающая в файле конфигурации

Команда Dockerfile RUN занимает много места на диске

У меня есть Dockerfile с этой командой RUN:

RUN ln -s /usr/java/jdk1.5.0_22 /usr/java/java-5-sun && \ ln -s /usr/java/jdk1.5.0_22 /usr/java/jdk1.5 && \ ln -s /usr/java/jdk1.6.0_45 /usr/java/java-6-sun && \ ln -s /usr/java/jdk1.6.0_45 /usr/java/jdk1.6 && \ ln -s /usr/java/jdk1.7.0_79 /usr/java/java-7-sun && \ ln -s /usr/java/jdk1.7.0_79 /usr/java/jdk1.7 && \ ln -s /usr/java/jdk1.8.0_60 /usr/java/java-8-sun && \ ln -s /usr/java/jdk1.8.0_60 /usr/java/jdk1.8 && \ chown -R user.root /usr/java 

но, как я вижу из истории, это занимает много дискового пространства !!

 /bin/sh -c ln -s /usr/java/jdk1.5.0_22 /usr/j 1.019 GB 

Ты знаешь почему?

Если я правильно понимаю вопрос, вы задаетесь вопросом, почему этот конкретный уровень изображения составляет 1 гигабайт, когда все, что вы делали, создавало несколько новых символических ссылок. Верный? (Почему четыре разных JDK большие по размеру должны быть понятны).

Ключ – это chown user.root /usr/java . Я сильно подозреваю, что этот оператор вызывает файлы, для которых были изменены разрешения (т. Е., Вероятно, весь каталог /usr/java ), чтобы снова добавить этот слой в изображение.

Вы можете проверить это поведение на очень простом примере. Рассмотрим следующий Dockerfile :

 FROM ubuntu:latest RUN echo foo > /tmp/bar RUN useradd foo RUN chown foo /tmp/bar 

Теперь создайте это изображение с помощью docker build а затем осмотрите его с docker history <image-id> :

 IMAGE CREATED CREATED BY SIZE COMMENT fdd96781f94f 5 seconds ago /bin/sh -c chown foo /tmp/bar 4 B 7237dbee1999 6 seconds ago /bin/sh -c useradd foo 330.3 kB 69ed7323a0b0 6 seconds ago /bin/sh -c echo foo > /tmp/bar 4 B 17b6a9e179d7 5 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B b0c2dfa2701f 5 months ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/ 1.895 kB 202e40f8bb3a 5 months ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0 B acb8e44f43fa 5 months ago /bin/sh -c set -xe && echo '#!/bin/sh' > /u 701 B 487bffc61de6 5 months ago /bin/sh -c #(nop) ADD file:ffc85cfdb5e66a5b4f 120.8 MB 

Используйте идентификатор самого верхнего слоя ( /bin/sh -c chown foo /tmp/bar ) и найдите этот идентификатор в /var/lib/docker/aufs/diff/<ID>... (при условии, что вы используете AUFS в качестве драйвера хранилища):

 $ find /var/lib/docker/aufs/diff/fdd96781f94feee4a6db44b11f7f9411c52238458ceeef202b2203e77b9970f4 /var/lib/docker/aufs/diff/fdd96781f94feee4a6db44b11f7f9411c52238458ceeef202b2203e77b9970f4 /var/lib/docker/aufs/diff/fdd96781f94feee4a6db44b11f7f9411c52238458ceeef202b2203e77b9970f4/tmp /var/lib/docker/aufs/diff/fdd96781f94feee4a6db44b11f7f9411c52238458ceeef202b2203e77b9970f4/tmp/bar 

Как вы можете видеть, изменение разрешений файла во время процесса сборки заставляет его снова добавлять на следующий слой изображения. Изменение разрешений для всех ваших Java-SDK приводит к тому, что все их (с размером ~ 1 гигабайт) добавляются в дополнительный слой изображения.