2017-02-09 10 views
2

При отправке докционированного node.js на производство правильно ли отправить изображение, содержащее зависимости развития?Как удалить зависимости развития в изображениях докеры на производстве

Я не говорю о зависимости развития Не devDependencies перечислены в packages.json, я имею в виду GCC, питон, узел-лавочку, некоторые другие * -dev упаковки, содержащая кучу заголовков, статических библиотеки. Все они необходимы для компиляции некоторых зависимостей узлов (например, node-sass).

Идея может быть двухэтапной сборкой, одним изображением со всеми зависимостями * -dev, созданием материала в нем и экспортом результатов в другой новое изображение только с двоичными файлами.

  • Плюсы: Окончательный «производства» изображение малого
  • Минусы: Не стандартный способ построения изображения

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

+0

«правильно ли отправить изображение, содержащее зависимости развития? Я не говорю о зависимостях зависимостей развития – Conan

+0

Вот почему в скобках объясняются зависимости развития, на которые я ссылался, но да, lol – Cesar

+0

см. Также https://www.dajobe.org/blog/2015/04/ 18/make-debian-docker-images-less/и http://blog.xebia.com/how-to-create-the-smallest-possible-docker-container-of-any-image/ – user2915097

ответ

0

Изображение не будет меньше, если вы удалите зависимости, потому что их более старые слои.

Попробуйте новый (экспериментальный) вариант -squash с docker-build, используя Docker 1.13.

+0

Точно, я могу а не просто удалять файлы на более позднем уровне, поэтому идея может заключаться в использовании образа для компиляции, а другое изображение - для хранения двоичных файлов, за исключением того, что теперь у меня должно быть два отдельных, не наследуемых файла Dockerfiles – Cesar

3

Если вы хотите, чтобы что-то не включалось в ваше окончательное изображение, вам необходимо выполнить все связанные команды только на одном уровне (один оператор RUN).

Что-то вроде следующего (псевдо-код):

RUN install dev-dependencies && build your-project && uninstall dev-dependencies 

только один слой, созданный для заявления RUN и он не будет содержать зависимости Dev.

1

Ответ на вопрос OP зависит от того, сколько изображений OP/его компания поддерживает для производственных нужд.

Там несколько стратегий возможных:

  1. Если количество поддерживаемых изображений среднего до низкого и архитектура системы не очень сложна и не использует десятки изображений одновременно есть самое простое и простое решение для поддержания является лучшим. Вы можете подойти к нему с помощью одной отдельной сборки. Или создать 2 шага, если вы хотите использовать скомпилированный источник в качестве базы для контейнеров, которые могут иметь различный контент (в этом случае 2-й этап может быть выполнен даже во время docker-compose up (запуск системы)).

  2. Вы можете удалить зависимые от dev-зависимые (в соответствии с другими ответами), если это необходимо для того, чтобы изображение было тонким/там было много запущенных контейнеров, которые используют одинаковое изображение/размер скомпилированных файлов. Это увеличит временной интервал процесса сборки, но приведет к уменьшению изображения.

  3. 3-ий подход совершенно другой - если есть процесс компиляции, используйте CI-конвейер, который независимо компилирует активы в отдельном контейнере (процесс выполнения CI) и предоставляет артефакт версии, который вы можете использовать в своих производственных сборках (даже хранить его где-то на S3/CDN/private, доступ к хранилищу развертывания), а затем просто извлекать его оттуда или просто использовать файлы, размещенные там (в случае CDN).