Публикация собственных образов Docker с помощью GitHub Actions

В этом посте я покажу, как легко можно создавать собственные образы 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}
Enter fullscreen mode Выйти из полноэкранного режима

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! 🔥

Оцените статью
devanswers.ru
Добавить комментарий