Как освободить место, которое использовалось ранее, но удаляется позже в образе докера - PullRequest
0 голосов
/ 28 февраля 2019

Я сейчас создаю образ Docker с помощью Dockerfile.

Я загружаю исходный код cmake и gcc, собираю и выполняю установку:

WORKDIR / root / source

RUN wget https://github.com/Kitware/CMake/releases/download/v3.12.4/cmake-3.12.4.tar.gz && tar xf cmake-3.12.4.tar.gz --remove-Files

RUN git clone https://github.com/gcc-mirror/gcc.git -b gcc-6-branch--single-branch

RUN cd gcc && ./configure --prefix = / usr --disable-multilib && make -j nproc && make install

RUN cd cmake-3.12.4 && ./configure && gmake -j nproc && make install

WORKDIR / root

Теперь мой размер образа докера составляет 11G, но исходный код использовал 8G.Поэтому я думаю, что исходный код для меня бесполезен, потому что у меня было make install, поэтому размер изображения может быть 3G, если я получу исходный файл?

Это размер моей файловой системы:

[root@a8df8af9539e source]# du / -hl --max-depth=1
4.0K    /lost+found
2.1G    /usr
4.0K    /media
107M    /var
28K     /tmp
0       /sys
4.0K    /srv
4.0K    /home
9.9M    /etc
7.9G    /root
0       /proc
4.0K    /opt
4.0K    /mnt
92K     /run
0       /dev
4.0K    /boot
11G     /

Я думаю, что да.

Затем я добавляю RUN rm -rf /root/source в конце Dockerfile и перестраиваю этот образ докера, однакоРазмер изображения также составляет 11G.Также укажите размер моей файловой системы:

[root@2a642ce974da ~]# du / -hl --max-depth=1
4.0K    /lost+found
2.4G    /usr
4.0K    /media
78M     /var
28K     /tmp
0       /sys
4.0K    /srv
4.0K    /home
12M     /etc
100K    /root
0       /proc
4.0K    /opt
4.0K    /mnt
100K    /run
0       /dev
4.0K    /boot
2.5G    /

Почему?Где мое место и как я могу освободить этот 8G диск?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Я думаю, что многоступенчатая сборка поможет вам в этом, поскольку на первом этапе вы можете создать свой код, а затем запустить его на следующем этапе.

# Stage 1: Build code
FROM <your image> as builder 
RUN <your build instructions>

# Stage 2: Run code
FROM <your image>  
# Copy artifacts from 'builder' stage 
COPY --from=builder <src folder from builder> <target folder>
# Run your code
CMD [...]

Подробную информацию можно найти в документация

0 голосов
/ 28 февраля 2019

Каждый оператор RUN, который вы добавляете в Dockerfile, создает новый слой, и в конце все слои объединяются (не объединяются напрямую, есть некоторые правила) для построения окончательного изображения.Даже если вы измените / удалите какой-либо файл на верхнем слое, он не удалит его с нижних слоев, просто каким-то образом затеняет его.

Вот пример Dockerfile:

FROM baseimage
RUN wget -O file http://...
RUN rm file

Длядля простоты, изображение, которое baseimage составляет 100 МБ, file составляет 80 МБ, и для этой сборки создано три слоя.Первый уровень - 100 МБ, второй - 80 МБ, последний имеет только некоторые метаданные, чтобы указать, что файл со второго уровня удален.Таким образом, результирующее изображение будет 180 МБ (состоит из трех слоев), даже если вы удалите 80 МБ на последнем слое.

Но если вы получите, установите и удалите один слой, вы увидите разницу:

FROM baseimage
RUN wget -O file http://... && rm file

Теперь ваш первый слой занимает 100 МБ, а второй слой - ~ 0 МБ (поскольку вы удаляете файл в том же операторе RUN), а ваше изображение - 100 МБ.

В двух словах, вы должны установить и удалить в том же RUN утверждении.

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