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