ИИ поможет создавать Dockerfile
Вы один из тех, кто считает написание файлов 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% новичков.
- Следует передовым практикам.
- Экономит время и силы.
- Позволяет избежать язвительных комментариев от специалистов по безопасности, инструменты которых генерируют отчеты с сотнями уязвимостей, о существовании которых вы и не подозревали.
Дисклеймер. Как и любой инструмент, основанный на искусственном интеллекте, эта утилита тоже не идеальна. Не стоит слепо доверять конфигурации, которую она генерирует. Рекомендую еще раз взглянуть на конфигурацию, прежде чем использовать ее.
Comments