Покрокова інструкція зі створення Dockerfile для Flask-додатків, що скорочують час збірки та проблеми з деплоєм
💡Вступ
Ласкаво просимо у світ DevOps! 🚀 Сьогодні ми поринемо у важливу навичку для кожного інженера DevOps: оптимізацію Dockerfile для Flask-додатків. Хоча новачки в DevOps часто зосереджуються на освоєнні базового синтаксису Dockerfile, досвідчені інженери знають, що справжня майстерність полягає в оптимізації — створенні Dockerfile, які є ефективними, безпечними та готовими до використання в продакшн-середовищі.
У цьому блозі ми пройдемо процес створення простого Flask-додатку. Спочатку створимо базовий Dockerfile, а потім вдосконалимо його, порівнюючи два варіанти, щоб зрозуміти різницю. Чи ви новачок, чи прагнете покращити свої навички роботи з Dockerfile, цей посібник має щось для кожного.
Давайте розпочнемо! 🛠️
💡Попередні вимоги
Перед тим, як приступити до написання та оптимізації Dockerfile для Flask-додатку, переконайтеся, що у вас є наступні попередні вимоги:
- Базове розуміння Flask
Знання того, як створювати простий Flask-додаток, допоможе вам безперешкодно йти за інструкцією. - Docker встановлено
Переконайтеся, що Docker встановлений та працює на вашій системі. Завантажити його можна з офіційного сайту Docker. - Налаштоване Python середовище
Python 3.x встановлений на вашій системі разом зpip
для керування Python пакетами. - Редактор коду
Використовуйте будь-який редактор коду на ваш вибір, наприклад, Visual Studio Code, PyCharm або Sublime Text. - Flask встановлений
Встановіть Flask у своєму Python середовищі за допомогою команди:
pip install flask
З цими вимогами ви будете готові до реалізації оптимізацій Dockerfile, про які ми поговоримо. Тепер давайте перейдемо до цікавої частини!
💡 Створення Flask-додатку
Для початку створимо простий Flask-додаток і підготуємо його до контейнеризації. Виконайте наступні кроки:
- Створення директорії проєкту
Створіть директорію з назвоюbasic-flask
і перейдіть у неї. - Створення 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" на веб-сторінці.
Перелік залежностей
Для контейнеризації додатку спочатку потрібно вказати необхідні 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
- Переконайтеся, що вміст базового Dockerfile збережено в файлі з назвою
Dockerfile
. - Побудуйте образ за допомогою наступної команди:
docker build -t basic-dockerfile .
Побудова образу з оптимізованого Dockerfile
- Збережіть вміст оптимізованого Dockerfile в окремий файл з назвою
Dockerfile
. - Побудуйте образ за допомогою цієї команди:
docker build -t optimised-dockerfile .
Порівняння побудованих образів
Коли образи побудовано, перелічіть усі Docker-образи за допомогою:
docker images
Ви повинні помітити значну різницю в розмірах образів:
- Образ з базовим Dockerfile: Приблизно 177MB
- Образ з оптимізованим Dockerfile: Приблизно 59.2MB
Чому оптимізований образ менший
- Легкий базовий образ: Оптимізований 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