В этом посте я покажу, как легко можно создавать собственные образы Docker, а затем использовать GitHub Actions для их развертывания в реестре Docker. Это позволит вам сэкономить время на настройку и сделает ваши среды более стабильными.
Необходимые условия
- Установленный Git и учетная запись GitHub
- Установленный Docker (для тестирования)
Начало работы с Docker
Docker — это инструмент виртуализации, который позволяет вам получить образ, поставляемый с предустановленными конфигурациями и программным обеспечением. Таким образом, вы можете выбрать операционную систему по своему вкусу (НЕТ IOS, это незаконно), а затем приступить к установке того, что вам нужно. Эти определения будут записаны в Dockerfile. Если у вас не установлен docker, обратитесь к их документации, установить его очень просто.
Напишите свой первый образ
Давайте начнем с очень простого образа Python. Мы возьмем последний дистрибутив Python и установим PYTHONUNBUFFERED=1
, чтобы гарантировать, что весь вывод python будет отправляться в терминал для лучшей отладки. Вставьте приведенные ниже строки в Dockerfile
(Да, файл не имеет расширения).
FROM python:latest
ENV PYTHONUNBUFFERED=1
После того, как вы получили файл, вы можете запустить команду
docker build . --file Dockerfile -t ${Image_Name}
Флаг --file
может быть использован в случае, если ваш Dockerfile не имеет имени по умолчанию или находится по другому пути. Флаг -t
используется для присвоения имени образу. После успешной сборки образа на вашей машине, вы можете продолжить и попытаться опубликовать его на hub.docker.com.
Далее мы хотим промаркировать наш образ, поэтому создайте учетную запись на docker hub. Нам понадобится пространство имен. Прежде чем продолжить, пожалуйста, авторизуйтесь локально с помощью docker login.
docker login --username ${USERNAME}
Это позволит вам войти в систему и сохранить зашифрованную версию ваших учетных данных для последующего локального использования.
Для версионирования образа мы используем теги, поэтому, если один образ по какой-либо причине окажется плохим, вы всегда сможете взять более ранний образ. Следующая команда помечает изображение. По умолчанию DOCKER_HUB_NAMESPACE
— это ваше имя пользователя в docker hub. Поэтому для меня это будет snakepy
.
docker tag "${IMAGE_NAME}" "${DOCKER_HUB_NAMESPACE}/${IMAGE_NAME}:${VERSION}"
Конкретный пример:
docker tag python-dev snakepy/python-dev:latest
После этого остается только загрузить образ в docker hub, чтобы вы могли использовать его позже, поэтому нужно выполнить команду:
docker push "${DOCKER_HUB_NAMESPACE}/${IMAGE_NAME}:${VERSION}"
После загрузки образа вы можете извлечь его из другого Dockerfile и потребовать его:
FROM ${DOCKER_HUB_NAMESPACE}/${IMAGE_NAME}:${VERSION}
WorkFlow для автоматизации
Я создал репозиторий, в который загружаю свои изображения. Рабочий процесс настроен таким образом, что если я загружу в этот репозиторий, он автоматически соберет все образы и отправит их в docker hub с новой версией. Я также создал запланированные задачи, которые периодически запускаются для выпуска последней версии образа.
Здесь начинается самое интересное, и как только вы настроите автоматизацию, вы сможете ее доработать, и она будет расти со временем. Вы можете взглянуть на мою текущую систему.
Чтобы автоматизировать создание образов docker, вам нужно выполнить следующие шаги:
- создать репозиторий для ваших образов
- установить секреты в хранилище
- создать файл рабочего процесса
- прибыль 💰
Сначала создайте репозиторий GitHub, а затем найдите вкладку secrets, там вы можете добавить новые секреты. Вам нужно будет добавить DOCKER_HUB_NAMESPACE
, DOCKER_HUB_PASSWORD
иDOCKER_HUB_USER
. Вы можете установить их либо как хранилище, либо как env рабочего процесса. Мне показалось проще просто задать их как переменную репозитория.
После добавления секретов мы можем перейти к файлу рабочего процесса GitHub. Файл(ы) должен быть внутри .github/workflows
. Там я создал два файла, один для запланированных задач, а другой — если я нажимаю. Это поможет нам легче справиться с версионированием изображений.
name: publish-to-docker-hub
on: [push]
env:
DOCKER_HUB_PASSWORD: ${{ secrets.DOCKER_HUB_PASSWORD }}
DOCKER_HUB_USER: ${{ secrets.DOCKER_HUB_USER }}
DOCKER_HUB_NAMESPACE: ${{ secrets.DOCKER_HUB_NAMESPACE }}
VERSION: ${{ github.sha }}
jobs:
publish_python:
runs-on: ubuntu-latest
env:
IMAGE_NAME: 'python-dev'
LANGUAGE: 'python'
LANGUAGE_VERSION: 3.10
steps:
- uses: actions/checkout@v2
- run: echo ${DOCKER_HUB_PASSWORD} | docker login --username "${DOCKER_HUB_USER}" --password-stdin
- run: docker build . --file ${IMAGE_NAME}/Dockerfile -t ${IMAGE_NAME}
- run: docker tag "${IMAGE_NAME}" "${DOCKER_HUB_NAMESPACE}/${IMAGE_NAME}:${LANGUAGE}${LANGUAGE_VERSION}-${VERSION}"
- run: docker push "${DOCKER_HUB_NAMESPACE}/${IMAGE_NAME}:${LANGUAGE}${LANGUAGE_VERSION}-${VERSION}"
Сначала мы определяем имя рабочего процесса publish-to-docker-hub
, а затем триггер действия. Затем мы определяем переменные, которые будут извлекаться из хранилища секретов GitHub. Затем мы определим наши задания. В разделе Jobs можно задать несколько заданий (посмотрите мой YAML-файл). По сути, мы делаем то, что я показывал ранее. Мы заходим в docker hub, создаем образ, помечаем образ и загружаем его.
Обратите внимание на структуру моего репозитория! Каждый Dockerfile размещен вот так ${IMAGE_NAME}/Dockerfile
. Таким образом, я могу писать небольшие документы с ним или даже иметь конфигурационные файлы, которые я могу скопировать во время сборки.
Теперь вы должны увидеть, что действие создается для каждого нажатия, которое вы делаете. Мне также нравится действие раз в месяц для выпуска последней версии образа, просто чтобы сохранить их свежесть.
Поэтому я создал второй файл рабочего процесса, который, по сути, является тем же самым, и единственное различие заключается в триггере и переменной VERSION.
on:
schedule:
- cron: '0 0 1 * *'
env:
DOCKER_HUB_PASSWORD: ${{ secrets.DOCKER_HUB_PASSWORD }}
DOCKER_HUB_USER: ${{ secrets.DOCKER_HUB_USER }}
DOCKER_HUB_NAMESPACE: ${{ secrets.DOCKER_HUB_NAMESPACE }}
VERSION: latest
ПОМОГИТЕ МНЕ 🚀
- Нужна ли вам помощь с чем-либо из написанного выше?
- Каким будет ваш первый образ? 😄
- Если вы думаете, что я могу улучшить — дайте мне знать.
- Понравилась ли вам статья? 🔥
Проверьте мой образ laravel-dev! 🔥