Оптимізація Dockerfile для Flask: Найкращі практики для DevOps і розробників

Покрокова інструкція зі створення Dockerfile для Flask-додатків, що скорочують час збірки та проблеми з деплоєм

pic

💡Вступ

Ласкаво просимо у світ DevOps! 🚀 Сьогодні ми поринемо у важливу навичку для кожного інженера DevOps: оптимізацію Dockerfile для Flask-додатків. Хоча новачки в DevOps часто зосереджуються на освоєнні базового синтаксису Dockerfile, досвідчені інженери знають, що справжня майстерність полягає в оптимізації — створенні Dockerfile, які є ефективними, безпечними та готовими до використання в продакшн-середовищі.

У цьому блозі ми пройдемо процес створення простого Flask-додатку. Спочатку створимо базовий Dockerfile, а потім вдосконалимо його, порівнюючи два варіанти, щоб зрозуміти різницю. Чи ви новачок, чи прагнете покращити свої навички роботи з Dockerfile, цей посібник має щось для кожного.

Давайте розпочнемо! 🛠️

💡Попередні вимоги

Перед тим, як приступити до написання та оптимізації Dockerfile для Flask-додатку, переконайтеся, що у вас є наступні попередні вимоги:

  1. Базове розуміння Flask
    Знання того, як створювати простий Flask-додаток, допоможе вам безперешкодно йти за інструкцією.
  2. Docker встановлено
    Переконайтеся, що Docker встановлений та працює на вашій системі. Завантажити його можна з офіційного сайту Docker.
  3. Налаштоване Python середовище
    Python 3.x встановлений на вашій системі разом з pip для керування Python пакетами.
  4. Редактор коду
    Використовуйте будь-який редактор коду на ваш вибір, наприклад, Visual Studio Code, PyCharm або Sublime Text.
  5. Flask встановлений
    Встановіть Flask у своєму Python середовищі за допомогою команди:
pip install flask

З цими вимогами ви будете готові до реалізації оптимізацій Dockerfile, про які ми поговоримо. Тепер давайте перейдемо до цікавої частини!

💡 Створення Flask-додатку

Для початку створимо простий Flask-додаток і підготуємо його до контейнеризації. Виконайте наступні кроки:

  1. Створення директорії проєкту
    Створіть директорію з назвою basic-flask і перейдіть у неї.
  2. Створення Flask-додатку
    У директорії basic-flask створіть файл з назвою app.py і вставте наступний код:
from flask import Flask  

 app = Flask(__name__)  

 @app.route("/")  
 def HelloWorld():  
 return "Hello World"  

 if __name__ == "__main__":  
 app.run()

Цей додаток можна запустити за допомогою команди:

python3 app.py

Відкрийте браузер і перейдіть за адресою http://localhost:5000. Ви повинні побачити текст "Hello World" на веб-сторінці.

pic

Перелік залежностей
Для контейнеризації додатку спочатку потрібно вказати необхідні Python модулі. Створіть файл requirements.txt, виконавши команду:

pip3 freeze > requirements.txt

💡 Створення Dockerfile

Тепер давайте створимо два варіанти Dockerfile: базову версію та оптимізовану.

Базовий Dockerfile

Базовий Dockerfile є простим, але не має оптимізацій ефективності та безпеки:

FROM python:3.9-slim  

WORKDIR /app  

COPY . /app  

RUN pip install -r requirements.txt  

CMD ["python3", "app.py"]

Цей Dockerfile функціонує, але є місце для покращень у кешуванні, оптимізації розміру та практиках безпеки.

Оптимізований Dockerfile

Оптимізований Dockerfile використовує багатостадійні збірки та включає кращі практики для ефективності, безпеки та модульності:

# syntax=docker/dockerfile:1.4  
# Стадія 1: Збірка залежностей  
FROM --platform=$BUILDPLATFORM python:3.10-alpine AS builder  

WORKDIR /code  
# Встановлення залежностей для збірки та кешування pip файлів для ефективності  

COPY requirements.txt /code  
RUN --mount=type=cache,target=/root/.cache/pip \  
 pip3 install --prefix=/install -r requirements.txt  

COPY .
/code  

# Стадія 2: Налаштування середовища для розробки  
FROM python:3.10-alpine AS dev-envs  

WORKDIR /code  

# Копіюємо файли додатку та встановлені залежності  
COPY --from=builder /install /usr/local  
COPY . /code  

# Встановлення додаткових інструментів для розробки (наприклад, Git, Bash)  
RUN apk update && apk add --no-cache git bash  

# Створення користувача без прав root для кращої безпеки  
RUN addgroup -S docker && \  
 adduser -S --shell /bin/bash --ingroup docker vscode  

# Встановлення точок входу та команд для розробки  
ENTRYPOINT ["python3"]  
CMD ["app.py"]  

# Стадія 3: Продакшн-версія образу  
FROM python:3.10-alpine AS final  
WORKDIR /app  

# Копіюємо лише необхідні файли додатку та залежності  
COPY --from=builder /install /usr/local  
COPY app.py /app  

ENTRYPOINT ["python3"]  
CMD ["app.py"]

Ключові відмінності між двома Dockerfile

  • Багатостадійна збірка: Оптимізований Dockerfile використовує багатостадійні збірки для зменшення розміру фінального образу та забезпечення чіткого розмежування між середовищами для збірки та виконання.
  • Кешування: Використовується --mount=type=cache, щоб прискорити встановлення pip, кешуючи залежності.
  • Користувач без прав root: Додається користувач без прав root для кращої безпеки.
  • Легкий образ: Використовується базовий образ Alpine для зменшення розміру образу.

💡 Збірка Dockerfile

Тепер, коли ми створили обидва Dockerfile, настав час побудувати Docker-образи та побачити різницю в їхніх розмірах. Дотримуйтесь наступних кроків:

Побудова образу з базового Dockerfile

  1. Переконайтеся, що вміст базового Dockerfile збережено в файлі з назвою Dockerfile.
  2. Побудуйте образ за допомогою наступної команди:
docker build -t basic-dockerfile .

pic

Побудова образу з оптимізованого Dockerfile

  1. Збережіть вміст оптимізованого Dockerfile в окремий файл з назвою Dockerfile.
  2. Побудуйте образ за допомогою цієї команди:
docker build -t optimised-dockerfile .

pic

Порівняння побудованих образів

Коли образи побудовано, перелічіть усі Docker-образи за допомогою:

docker images

Ви повинні помітити значну різницю в розмірах образів:

  • Образ з базовим Dockerfile: Приблизно 177MB
  • Образ з оптимізованим Dockerfile: Приблизно 59.2MB

pic

Чому оптимізований образ менший

  • Легкий базовий образ: Оптимізований Dockerfile використовує python:3.10-alpine, що значно менше за розміром, ніж python:3.9-slim.
  • Багатостадійна збірка: Непотрібні залежності для збірки виключені з фінального образу, що дозволяє зберегти його мінімальним.
  • Ефективне кешування: Використання кешування для встановлення pip запобігає надлишковим завантаженням і зменшує кількість шарів образу.

💡 Висновок

Оптимізація Dockerfile — це важлива навичка для інженерів DevOps, які прагнуть створювати ефективні, безпечні та готові до продакшн контейнери. У цьому блозі ми розглянули, як створити простий Flask-додаток, контейнеризувати його за допомогою базового Dockerfile, а потім вдосконалити його, використовуючи оптимізований Dockerfile.

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

Продовжуючи свою подорож у світі DevOps, завжди прагніть вдосконалювати свої Dockerfile, включаючи оптимізації, враховуючи безпеку та мінімізуючи накладні витрати.
Добре оптимізований Dockerfile не лише економить час і ресурси, а й забезпечує більш плавні деплойменти та масштабованість у продакшн-середовищі.

🚀 Для більше корисних блогів слідкуйте за мною на Hashnode, X(Twitter) та LinkedIn.

Щасливого кодування та автоматизації! 🚀

Перекладено з: Optimising Flask Dockerfiles: Best Practices for DevOps and Developers

Leave a Reply

Your email address will not be published. Required fields are marked *