Изображение Docker увеличивается в размерах, поскольку файлы не меняются - PullRequest
0 голосов
/ 18 октября 2019

Каждый раз, когда я строю свой образ докера, кажется, что он увеличивается в 5-10 Мб без видимой причины.

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

Ниже приведены 3 изображения, которые построены с однострочными изменениями кода и работают с docker -it <img_id> /bin/sh, а затем du -d1 из корня. Все 3 не имеют различий между размерами блоков и файлов.

Есть идеи, почему я теряю 5-10 МБ на сборку?

9add242d3e75        2 hours ago         438MB
# du -d1
4           ./run
1472        ./var
4           ./opt
4           ./tmp
4972        ./lib
0           ./proc
4           ./srv
4           ./mnt
359692      ./usr
16            ./media
264           ./sbin
0           ./dev
0           ./sys
1740        ./etc
1084        ./bin
8           ./root
4           ./home
42024       ./app
411300      .

45ed1ea39f3a        13 hours ago        432MB
# du -d1
4           ./run
1472        ./var
4           ./opt
4           ./tmp
4972        ./lib
0           ./proc
4           ./srv
4           ./mnt
359692      ./usr
16            ./media
264           ./sbin
0           ./dev
0           ./sys
1740        ./etc
1084        ./bin
8           ./root
4           ./home
42024       ./app
411300      .

4740856ed1b7        13 hours ago        421MB
# du -d1
4           ./run
1472        ./var
4           ./opt
4           ./tmp
4972        ./lib
0           ./proc
4           ./srv
4           ./mnt
359692      ./usr
16            ./media
264           ./sbin
0           ./dev
0           ./sys
1740        ./etc
1084        ./bin
8           ./root
4           ./home
42024       ./app
411300      .

[ПРАВИТЬ] Используя погружение, я смогчтобы увидеть, что наворот исходит от команды COPY, которая действительно увеличивается в размере (tmp / folder), но у меня есть специальная команда для rm -rf tmp, чтобы освободить это пространство.

Похоже, COPY кэширует размер?

Окончательный размер изображения остается, даже если я удаляю то, что вызывает разницу в размере?

КОПИЯ, показывающая tmp / w / bloat

before deletion showing size difference

RUN rm -rf tmp для удаления наворотов

bloat removed? no

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Пока не можете комментировать, поэтому введите его здесь. Ваш последний ответ звучит правильно. Пока в вашем Dockerfile есть копия COPY, размер изображения увеличивается до объема, который вы копируете. Даже если позже у вас будет RUN rm -rf, ваше изображение останется с тем же размером, потому что уровень Docker для выполнения RUN rm -rf tmp отделен от уровня COPY. Таким образом, первый слой, который выполняет копирование, увеличивает размер копируемой вещи. Тогда у вас есть слой RUN, который удаляет TMP. Таким образом, чтобы поместить его в другую перспективу, как для слоя RUN для удаления tmp, сначала необходимо заполнить tmp содержимым слоя COPY. Поэтому, даже если после выполнения уровня RUN предполагается, что tmp будет очищен, этому слою все еще нужны данные, которые он должен удалить, чтобы они присутствовали на предыдущем уровне.

Один из способов избежать этого - этоиспользовать тома Docker. Вы можете использовать docker run, передавая том для монтирования и каталог для монтирования внутри контейнера. Посмотрите этот пост Как монтировать тома хоста в Docker-контейнеры в Dockerfile во время сборки , где они обсуждают различные варианты этого

0 голосов
/ 18 октября 2019

Нашел ответ здесь: https://forums.docker.com/t/why-run-command-which-deletes-files-inflates-image-size/33670/6

Это ожидаемое поведение, потому что COPY приносит файлы.

Есть экспериментальный (по состоянию на октябрь '19) флаг --squash, который можно использовать на docker build, но он теряет основные преимущества слоев.

Мне придется придумать другую схему, чтобы избежать переноса файлов через папку tmp.

[РЕДАКТИРОВАТЬ] Я закончил тем, что использовал промежуточные контейнеры, чтобы «раздеть» то, что я не хотел.

ARG BUILDER_REPO='replace-repo'

FROM ${BUILDER_REPO} as build_img
WORKDIR /app
RUN rm -rf tmp

FROM ruby:2.6.5-alpine
WORKDIR /app
COPY --from=build_img /app .

Отлично сработало для меня, с 200mb -> 140mb

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