Вы один из тех, кто считает написание файлов Dockerfiles и docker-compose.yml утомительным занятием? По крайней мере, мне это никогда не нравилось.

Меня всегда мучил вопрос: следую ли я лучшим практикам или неосознанно вношу уязвимости в систему безопасности при написании файлов конфигурации Dockerfile и docker-compose?

Теперь нам больше не придется об этом беспокоиться, за что нужно поблагодарить людей из Docker, которые нашли отличное применение генеративному ИИ. Они создали CLI-утилиту docker init.

Представление docker init

Компания Docker представила общедоступную версию docker init. Я попробовал ее, нашел очень полезной и не могу дождаться, когда начну использовать ее в повседневной жизни.

Что такое docker init?

docker init—  это утилита командной строки, которая помогает инициализировать в проекте Docker-ресурсы. Она создает файлы Dockerfile, compose.yaml и .dockerignore на основе требований проекта.

Это упрощает процесс настройки Docker для конкретного проекта, экономит время и снижает сложность работы.

Последняя версия docker init поддерживает Go, Python, Node.js, Rust, ASP.NET, PHP и Java. Она доступна в приложении Docker Desktop.

Как использовать docker init?

Использовать docker init очень легко. Достаточно сделать несколько простых шагов. Сначала нужно перейти в каталог проекта и установить необходимые активы Docker.

Создадим базовое Flask-приложение.

touch app.py requirements.txt

Скопируйте приведенный ниже код и перенесите его в соответствующие файлы.

# app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_docker():
return '<h1> hello world </h1'

if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')
# requirements.txt
Flask

Впечатляющая магия docker init

docker init просканирует проект и попросит подтвердить и выбрать шаблон, наиболее подходящий для приложения. После выбора шаблона docker init запросит специфическую для проекта информацию и автоматически сгенерирует необходимые для него ресурсы Docker.

docker init

После этого надо выбрать платформу приложения. В данном случае используем python. Она предложит рекомендуемые для проекта значения, такие как версия Python, команды port и entrypoint.

Можно выбрать значения по умолчанию или указать нужные значения, и файлы конфигурации docker будут созданы вместе с инструкциями по запуску приложения.


Теперь посмотрим, как выглядит эта автоматически сгенерированная конфигурация.

  • Dockerfile:
# syntax=docker/dockerfile:1

# Чтобы помочь вам начать работу, в этом файле приведены комментарии.
# Если вам нужна дополнительные сведения, обратитесь к справочному руководству по Dockerfile по адресу
# https://docs.docker.com/engine/reference/builder/

ARG PYTHON_VERSION=3.11.7
FROM python:${PYTHON_VERSION}-slim as base

# Запрещает Python писать файлы pyc.
ENV PYTHONDONTWRITEBYTECODE=1

# Не позволяет Python буферизовать stdout и stderr, чтобы избежать ситуаций,
# когда приложение аварийно закрывается, не выдавая логов из-за буферизации.
ENV PYTHONUNBUFFERED=1

WORKDIR /app

# Создайте непривилегированного пользователя, от имени которого будет работать приложение.
# См. https://docs.docker.com/go/dockerfile-user-best-practices/
ARG UID=10001
RUN adduser \
--disabled-password \
--gecos "" \
--home "/nonexistent" \
--shell "/sbin/nologin" \
--no-create-home \
--uid "${UID}" \
appuser

# Загрузите зависимости отдельным шагом, чтобы воспользоваться преимуществами кэширования Docker.
# Используйте функцию монтирование кэша в /root/.cache/pip для ускорения последующих сборок.
# Используйте привязку к файлу requirements.txt, чтобы избежать необходимости копировать в
# этот слой.
RUN --mount=type=cache,target=/root/.cache/pip \
--mount=type=bind,source=requirements.txt,target=requirements.txt \
python -m pip install -r requirements.txt

# Переключитесь на непривилегированного пользователя, чтобы запустить приложение.
USER appuser

# Скопируйте исходный код в контейнер.
COPY . .

# Откройте порт, который прослушивает приложение.
EXPOSE 5000

# Запустите приложение.
CMD gunicorn 'app:app' --bind=0.0.0.0:5000

Этот Dockerfile гораздо лучше всего того, что я когда-либо мог написать. В нем соблюдены все эффективные практики производительности и безопасности, рекомендуемые в сообществах Linkedin и Medium.

  • compose.yaml:

Была произведена запись docker-compose config для запуска приложения. Поскольку в приложении нет подключения к базе данных, код, который может понадобиться для контейнера базы данных, был закомментирован.

Если вам понадобится использовать базу данных совместно с Flask-приложением, раскомментируйте конфигурацию базы данных из файла docker-compose, создайте локальный файл с секретными сведениями и запустите приложение. При этом также создастся файл .dockerignore.


Зачем использовать docker init?

С помощью docker init докеризация становится проще простого, особенно для новичков в Docker. Эта утилита устраняет ручную работу по написанию Dockerfiles и других конфигурационных файлов, экономя время и сводя к минимуму ошибки.

Она использует шаблоны для настройки Docker в зависимости от типа приложения, следуя при этом лучшим отраслевым практикам.

Заключение

Напоследок хочу подчеркнуть, что docker init делает за вас все.

  • Пишет конфигурацию Docker лучше, чем 90% новичков.
  • Следует передовым практикам.
  • Экономит время и силы.
  • Позволяет избежать язвительных комментариев от специалистов по безопасности, инструменты которых генерируют отчеты с сотнями уязвимостей, о существовании которых вы и не подозревали.

Дисклеймер. Как и любой инструмент, основанный на искусственном интеллекте, эта утилита тоже не идеальна. Не стоит слепо доверять конфигурации, которую она генерирует. Рекомендую еще раз взглянуть на конфигурацию, прежде чем использовать ее.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Akhilesh Mishra: You should stop writing Dockerfiles today — Do this instead

Предыдущая статьяMap-ориентированное программирование в Java
Следующая статьяОсвойте оконные функции SQL раз и навсегда