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

текст перекладу

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

pic

💡Вступ

Ласкаво просимо у світ DevOps! 🚀 Сьогодні ми зануримося в одну з основних навичок для будь-якого DevOps інженера: оптимізацію Dockerfile для Flask-додатків. Хоча початківці часто зосереджуються на освоєнні основного синтаксису 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  

# Створюємо користувача без прав адміністратора для кращої безпеки  
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, кешуючи залежності.
  • Користувач без прав адміністратора: Додається користувач без прав адміністратора для кращої безпеки.
  • Легкий образ: Використовує базовий образ Alpine для мінімізації розміру образу.

💡 Створення Docker-образів

Тепер, коли ми створили обидва 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 *