среда, 17 декабря 2014 г.

ООП в контейнерах docker

Каждая новая команда изменяющая состояние контейнера в Dockerfile создает новый образ диска- image.

Посмотреть их можно через docker images. Мне очень нравится ключ --tree к ней, но не понимаю почему они её пометили как depricated.

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

К примеру два контейнера с такими Dockerfile:
FROM debian:testing
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y ssmtp
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y net-tools
и второй с другим порядком команд
FROM debian:testing
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y net-tools
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y ssmtp
Построят 4 разных образа, два промежуточных, два конечных, плюс debian-testing.

Но функционал то будет одинаков - фактически пустая потеря места, и лишняя сложность.

Вот так выглядела часть дерева моих образов docker

 Один общий далекий предок debian/testing и затем огромная куча разных промежуточных образов.

Рефакторим это. Выделим общие настройки и софт в base образ, и унаследуем остальные от него.

Теперь дерево выглядит так:

Не идеально, но лучше.

Общий предок стал гораздо ближе к листьям дерева, значит больше дискового пространства стало общим.

Если вам не нравится большие развесистые деревья можно в dockerfile объединить команды в одну
RUN command1 && command2
тогда на две команды будет только один образ.
К реальному уменьшению потребления дискового пространства это вряд-ли приведет, но дерево будет аккуратнее.
Я так иногда делаю с теми образами которые уже не меняю.
Но для часто меняемых и перестраиваемых предпочитаю иметь команды отдельными строками.
Docker умеет кешировать, и не перестраивать неизменяемые состояния, что очень удобно.