Код 7

Як Dockerfile допомагає контролювати свій код

Як Dockerfile допомагає контролювати свій код — ілюстрація до новини в рубриці «Код»
Як Dockerfile допомагає контролювати свій код — ілюстрація до новини в рубриці «Код»

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

Хоча сучасні стеки, як-от Ghost з MySQL, можуть бути стабільними після розв'язання проблем перегони при запуску, вони часто створюють проблему: після повного скидання системи (docker compose down --volumes) увесь ручний процес налаштування повторюється. Якщо ви використовуєте образ із Docker Hub без власного контролю, він не запам'ятовує ваші унікальні зміни.

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

Підготовка робочого середовища

Перш ніж розпочати роботу з Dockerfile, необхідно виконати кілька передумов та створити структуру проєкту. Переконайтеся, що ви вже завершили епізоди 1–10 і впевнено працюєте з файлами Compose та перевірками стану (health checks).

Створіть робочу директорію для цього навчального матеріалу:

$ mkdir -p ~/noteboard
$ cd ~/noteboard

У цій директорії ви створите три ключові файли: app.py (код застосунку), requirements.txt (список залежностей) та Dockerfile (інструкції збірки).

Створення мінімального Flask-застосунку

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

Спочатку створіть файл app.py:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def index():
    return "<h1 >Noteboard</h1 ><p>Hello.</p>"

Далі, визначте необхідні залежності у файлі requirements.txt:

flask==3.1.3

Перший Dockerfile: Збірка сервера розробки

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

FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 5000
CMD ["flask", "run", "--host=0.0.0.0"]

Кожна інструкція в цьому файлі виконує конкретне завдання:
* FROM python:3.12-slim: Вказує, що збірка починається з офіційного образу Python 3.12 slim — це менший за розміром і більш ефективний базовий образ.
* WORKDIR /app: Встановлює робочу директорію всередині контейнера. Усі наступні команди будуть виконуватися саме тут.
* COPY requirements.txt.: Копіює файл вимог із вашого моста до /app.
* RUN pip install ...: Виконує встановлення залежностей під час збірки образу. Цей шар кешується, що прискорює подальші збірки, якщо requirements.txt не змінився.
* COPY app.py.: Копіює вихідний код застосунку у контейнер.
* EXPOSE 5000: Документує, що цей контейнер слухатиме на порту 5000. Важливо: ця інструкція лише сигналізує про порт, для доступу ззовні все одно потрібен -p під час запуску.
* CMD [...]: Визначає команду, яка автоматично виконується при старті контейнера.

Для збірки та запуску застосунку виконайте наступні команди:

$ docker build -t noteboard .
$ docker run -d -p 5000:5000 --name noteboard noteboard

Перевірка роботи застосунку через curl підтвердить успішне розгортання.

Перехід на Gunicorn для production-grade

Вбудований сервер Flask, який використовується у режимі розробки, є однопотоковим і не призначений для обслуговування реального трафіку. Для корпоративного рівня (production-grade) необхідно використовувати WSGI-сервер, такий як Gunicorn.

Додайте gunicorn до файлу requirements.txt:

flask==3.1.3
gunicorn==22.0.0

Оновіть команду запуску (CMD) у вашому Dockerfile, щоб вона використовувала Gunicorn:
```dockerfile

... (попередні інструкції залишаються незмінними)

CMD ["gunicorn", "--bind", "0.0.0.

Telegram Logo Читайте нас у Telegram: @procodeandevenmore