У Льоні сьогодні

Docker - це не система збірки

…Взагалі, вчорашні відкриття наштовхнули мене на наступний хід міркувань.

Раніше я дивився на Docker як на верхній рівень скриптів збірки. Тобто, щоб ми запускали docker build або docker compose, а все інше витікало звідти. А якщо так не виходить, то це погано, та треба докладати зусиль, щоб затягти всі аспекти збірки всередину Dockerfile. Наприклад, використовувати проміжні контейнери, монтування кешу, як я вчора писав, та інші засоби.

Але насправді, Dockerfile та docker buld не є гарною реалізацією системи збірки, тобто аналогом make, rake, чи просто скриптів оболонки.

  • Збірка потребує інструментів, які не потрібні в остаточному образі, а також утворює зайві артефакти. Наприклад, файли журналів можна знайти в багатьох публічно доступних образах, що не тільки збільшує їх розмір, але й може вести до витоку інформації.

  • Кеш, доступний в Docker через RUN --cache, є обмеженим та потребує особливих дій. Наприклад, до нього немає доступу з хосту.

  • Підготовка до збірки Dockerfile - той крок, що називається transferring context - відбувається через копіювання файлів, що досить неефективно та може тривати десятки секунд. Можна замість того монтувати залежності через RUN --mount, але то, як і кеш, потребує особливого ставлення.

Одним словом, відтепер буду використовувати Dockerfile тільки для створення образу з вже готових артефактів. Та нічого страшного, якщо docker build буде лише частиною більшого скрипту збірки.