Я Чу, Чу, выберите изображение контейнера (3 серии деталей)
В последних двух постах (часть 1 и часть 2) в этой серии мы рассмотрели, какие базовые изображения доступны нам в качестве разработчиков. Затем мы занялись скомпилированными языками с Голангом. Теперь в этом посте мы рассмотрим варианты, доступные нам, используя динамический язык. Прежде чем мы начнем, мы должны убрать что -то с дороги. Если вы следили за серией, мы говорили о базовом изображении Scratch. У меня есть некоторые плохие новости, если вы используете динамический язык, вы не сможете использовать царапину, поскольку вам нужна установленная среда выполнения, в отличие от составленных языков. Итак, в этом посте мы собираемся использовать полную ОС, Слим ОС и Альпийские изображения Linux.
Если вы хотите воспользоваться многоэтапными сборками с динамичным языком, это немного более нюансировано. Поскольку у нас не будет ни одного бинарного для копирования, говоря, что мы все еще можем использовать многоэтапные сборки. Python на самом деле довольно приятно использовать в многоэтапных сборках, поскольку он имеет Virtualenv который дает использование логического разделения зависимостей, которые нам нужно для запуска наше приложение. Чтобы использовать многоэтапную сборку, вы скопируете каталог VirtualENV из контейнера сборки до конечного изображения. Опять же, как и в примере Golang, приложение, которое мы используем, довольно легкое. Просто простой веб -сервер Python, размещающий статический HTML -файл. Если вы хотите просмотреть код, просто иди здесь .
Так, как упоминалось ранее, у нас есть три варианта с динамичным языком, поэтому мы начнем с полного изображения ОС.
FROM python:3.8.0a2-stretch as build RUN python3 -m venv /web COPY . /web FROM python:3.8.0a2-stretch COPY --from=build /web /web WORKDIR /web EXPOSE 8080 ENTRYPOINT [ "python", "web]
Как только мы строим наше базовое изображение с помощью Dockerfile выше, используя многоэтапные сборки, у нас будет изображение 945 МБ
Таким образом, поскольку вы можете видеть, что динамические языковые контейнерные изображения намного больше, чем скомпилированные языки из -за необходимости времени выполнения. Теперь, помня из нашего первого поста, это изображение также содержит критические уязвимости. Итак, давайте перейдем к тонкому изображению, как посмотрим, сколько размера изображения мы можем сохранить.
FROM python:3.8.0a2-slim-stretch as build RUN python3 -m venv /web COPY . /web FROM python:3.8.0a2-slim-stretch COPY --from=build /web /web WORKDIR /web EXPOSE 8080 ENTRYPOINT [ "python", "web.py" ]
С помощью этой сборки с использованием Slim OS в качестве базового изображения мы получаем размер изображения 159 МБ
Таким образом, как вы можете видеть, это огромная экономия в размере путем замены с полного изображения ОС на тонкую версию той же ОС. К сожалению, это изображение все еще поставляется с уязвимыми пакетами. Так что, если мы перенесем наше приложение в Alpine Linux, какие преимущества мы приносим?
FROM python:3.8.0a2-alpine3.9 as build RUN python3 -m venv /web COPY . /web FROM python:3.8.0a2-alpine3.9 COPY --from=build /web /web WORKDIR /web EXPOSE 8080 ENTRYPOINT [ "python", "web.py" ]
Теперь переезд в Alpine Linux дал нам самый маленький размер изображения, входящий в 103 МБ
без критических уязвимостей. Теперь мы кратко рассказали об этой проблеме в Часть 1 Анкет Alpine не использует глибк
Вместо этого он использует Musl Libc
Теперь это гораздо важнее для динамического языка, как если бы у вас были зависимости, которые зависят от глибк
У вас могут быть проблемы с альпийским.
Если вы хотите посмотреть какой -либо из кода для этой серии сообщений, пожалуйста, посетите мой GitHub Page Анкет Для дальнейшего изучения контейнеров или Kubernetes проверить мой OSS Workshop Или вы всегда можете задать мне любой вопрос в Twitter @scottcoulton
Я Чу, Чу, выберите изображение контейнера (3 серии деталей)
Оригинал: “https://dev.to/scottyc/i-cho-cho-choose-you-container-image-part-3-5aj9”