Комментарии 13
А если применить multi-stage build? Один образ Alpine для компиляции зависимостей, другой для рантайма. Конечно, это ещё больше возни, чем предложенный вариант, но экономия места всё же будет.
А почему вы не удаляете из сборки *-dev пактеы, которые ненужны после компиляции?
Сам делаю вот так: разбиваю пакеты на две группы. перечисленные в dev удаляю после установки pip -r
RUN apk update && \\
cat /opt/app/requirements/apk.txt | xargs apk add --no-cache && \\
cat /opt/app/requirements/apk_dev.txt | xargs apk add --no-cache && \\
python3 -m pip install -r /opt/app/requirements/python-requirements.txt && \\
cat /opt/app/requirements/apk_dev.txt | xargs apk del
Удаление тяжелых тяжелых пакетов типа mariadb-dev сильно экономит место и заметно ускоряет деплой.
apk add --no-cache --virtual .build-deps
....
apk del .build-deps
А Вы уверены что "apk del .build-deps" удаляет и фактически освобождает место? У меня возникли сомнения потому, что докер использует overlayfs2 за которым стоит union mount. https://docs.docker.com/glossary/?term=overlay%20storage%20driver
То есть нужно точно знать что все действия развертыванию, компиляции с её временными файлами, деплою и удалению инструментария происходят в одном и том же обязательно последнем слое фс.
В противном случае никакого фактического освобождения места может не оказаться.
К примеру образ на alpine python:3.7-rc-alpine весит 94,5Мб, а образ на debian 9 slim python:3.7-rc-slim всего 143Мб, что не многим больше.
Ну в принципе вы не открыли Америку. Если много зависимостей, то Альпайн — это ещё та заноза!
На тему размера — приятно, конечно, иметь образ поменьше, но во всем нужен баланс: если посчитать стоимость времени инженера и стоимость стораджа — может оказаться, что и фиг с ним, с местом.
Бесплатный hub.docker.com собирает около 2х часов
Как раз заточенную под docker-контейнеры и весом 157мб, похоже пора дополнить статью.
The 29MB Docker image for Minimal Ubuntu 18.04 LTS serves as a highly efficient container starting point, and allows developers to deploy multicloud containerized applications faster. For modern Docker workflows with Kubernetes, the minimal Ubuntu image provides a balance of compatibility, familiarity, performance and size. This is the standard Ubuntu 18.04 LTS image on the Docker Hub.
Cloud images also contain the optimised kernel for each cloud and supporting boot utilities.
$ docker pull ubuntu:18.04
Trying to pull repository docker.io/library/ubuntu ...
sha256:5f4bdc3467537cbbe563e80db2c3ec95d548a9145d64453b06939c4592d67b6d: Pulling from docker.io/library/ubuntu
6b98dfc16071: Pull complete
4001a1209541: Pull complete
6319fc68c576: Pull complete
b24603670dc3: Pull complete
97f170c87c6f: Pull complete
Digest: sha256:5f4bdc3467537cbbe563e80db2c3ec95d548a9145d64453b06939c4592d67b6d
Status: Downloaded newer image for docker.io/ubuntu:18.04
[fedora@atomic-3 ~]$ docker images --all
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu 18.04 113a43faa138 4 weeks ago 81.2 MB
Что не похоже на то, что свежий образ)
Так ли мал Alpine 3.8 Docker для Python 3 runtime