Эта статья была первоначально размещена по адресу: https://www.codependentcodr.com/docker-and-image-sizes.html 12 августа 2018 года
Так что это удивило меня. У меня был Dockerfile, который выглядел в основном так:
FROM alpine:latest RUN apk add --no-cache --update \ python3 nodejs-current-npm make git curl RUN python3 -m ensurepip RUN pip3 install --upgrade pip RUN npm install -g markdownlint-cli # needed for one of the packages in requirements.txt RUN apk add --no-cache --update python3-dev gcc build-base COPY requirements.txt /build/requirements.txt RUN pip3 install -r /build/requirements.txt
Построение этого изображения привело к изображению, которое Docker Images
сообщается как 379 МБ. Это немного большое Так что я хотел обрезать.
Поскольку эти пакеты установлены незадолго до копирования Требования.txt
к изображению были только там, чтобы иметь возможность установить Пакет, у них нет причин оставаться на изображении. Круто, чтобы мы могли их сэкономить на размере изображения:
FROM alpine:latest RUN apk add --no-cache --update \ python3 nodejs-current-npm make git curl RUN python3 -m ensurepip RUN pip3 install --upgrade pip RUN npm install -g markdownlint-cli # needed for one of the packages in requirements.txt RUN apk add --no-cache --update python3-dev gcc build-base COPY requirements.txt /build/requirements.txt RUN pip3 install -r /build/requirements.txt # cleanup unneeded dependencies RUN apk del python3-dev gcc build-base
Сладкое, и это привело к размеру изображения 381 МБ , экономия Отрицательный 2 МБ Анкет Подожди …. что?
Итак, я удалено Некоторые вещи и в итоге получили изображение, которое несколько МБ больше ? Как это работает?
И именно здесь, если мы хотим получить технику, мы начинаем говорить о том, как Docker использует слоистую файловую систему и как таковой (не совсем не похожий на GIT Repos) после того, как что -то добавляется в изображение, оно не может (или, по крайней мере, легко)) удалить.
Смотрите эту проблему, в которой упоминается то, о чем я говорю: https://github.com/gliderlabs/docker-alpine/issues/45
Так что же нам делать? Ну, мы комбинация операции в одну инструкцию Docker:
FROM alpine:latest RUN apk add --no-cache --update \ python3 nodejs-current-npm make git curl RUN python3 -m ensurepip RUN pip3 install --upgrade pip RUN npm install -g markdownlint-cli COPY requirements.txt /build/requirements.txt RUN apk add --no-cache --update python3-dev gcc build-base && \ pip3 install -r /build/requirements.txt && \ apk del python3-dev gcc build-base
Поскольку добавление и удаление пакетов APK представляют собой инструкцию по одному Docker, они не надувают размер встроенного изображения (вы можете думать о слоях как «контрольно -пропускных пунктах» после каждой инструкции в dockerfile
).
С этим изменением размер изображения упал Значительно Анкет Сколько? Давайте позволим инструменту сообщить нам:
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE someimage combineops 1744771da3fa About a minute ago 216MB someimage removepckgs fc5877e2afad 4 minutes ago 381MB someimage original b6e5e43b22e0 5 minutes ago 379MB
То есть он упал с 379 МБ к 216 МБ Анкет Совсем не плохая экономия.
Это классический компромисс «время против пространства», хотя. Потому что мне пришлось переместить Требования.txt
Создайте линию, это означает, что сборка этого изображения часто медленнее (из -за того, как работает кэш Docker, если я изменю файл Telect.txt.txt, тогда ему придется установить эти пакеты APK в любое время Требования.txt
изменения). Тем не менее, я думаю, что экономия в космосе (40%+) того стоит.
Оригинал: «https://dev.to/pzelnip/docker-and-image-sizes-209a»