Введение
В этом руководстве показано, как создать рабочий процесс, который выполняет сборку Docker, а затем публикует образы Docker в Docker Hub или GitHub Packages. С помощью одного рабочего процесса можно публиковать образы в одном или нескольких реестрах.
Примечание. Если требуется выполнить отправку в другой сторонний реестр Docker, пример в разделе «Публикация образов в GitHub Packages» может послужить хорошим шаблоном.
Предварительные требования
Рекомендуется иметь базовое представление о параметрах конфигурации рабочих процессов, а также о том, как создавать файл рабочего процесса. Дополнительные сведения см. в разделе Изучение GitHub Actions.
Кроме того, могут быть полезны базовые знания в следующих областях:
- "Зашифрованные секреты"
- "Автоматическая проверка подлинности токенов"
- "Работа с реестром контейнеров"
Сведения о конфигурации образа
В этом руководстве предполагается, что у вас имеется полное определение образа Docker, хранящегося в репозитории GitHub. Например, репозиторий должен содержать Dockerfile и все остальные файлы, необходимые для выполнения сборки Docker и создания образа.
Вы можете использовать предварительно определенные ключи заметок для добавления метаданных, включая описание, лицензию и исходный репозиторий, в образ контейнера. Дополнительные сведения см. в разделе Работа с реестром контейнеров.
В этом руководстве мы будем использовать действие build-push-action
Docker для сборки образа Docker и отправки его в один или несколько реестров Docker. Дополнительные сведения см. на веб-сайте build-push-action
.
Публикация образов в Docker Hub
Каждый раз при создании выпуска в GitHub можно активировать рабочий процесс для публикации образа. Рабочий процесс в приведенном ниже примере выполняется при активации события release
с типом действия created
. Дополнительные сведения о событии см. в release
разделе События, инициирующие рабочие процессы.
В приведенном ниже примере рабочего процесса мы используем действия Docker login-action
и build-push-action
для сборки образа Docker и в случае успешного выполнения сборки отправляем созданный образ в Docker Hub.
Для отправки в Docker Hub потребуется учетная запись Docker Hub и создания репозитория Docker Hub. Дополнительные сведения см. в разделе «Отправка образа контейнера Docker в Docker Hub» документации по Docker.
Ниже приведены параметры login-action
, необходимые для Docker Hub.
username
иpassword
: это имя пользователя и пароль Docker Hub. Рекомендуется хранить имя пользователя и пароль Docker Hub в качестве секретов, чтобы не раскрыть их в файле рабочего процесса. Дополнительные сведения см. в разделе Зашифрованные секреты.
Ниже приведен параметр metadata-action
, необходимый для Docker Hub.
images
: пространство имен и имя образа Docker, который вы собираете или отправляете в Docker Hub.
Ниже приведены параметры build-push-action
, необходимые для Docker Hub.
tags
: тег нового образа в форматеDOCKER-HUB-NAMESPACE/DOCKER-HUB-REPOSITORY:VERSION
. Можно задать один тег, как показано ниже, или указать несколько тегов в виде списка.push
: если задано значениеtrue
, образ будет отправлен в реестр в случае успешной сборки.
# Этот рабочий процесс использует действия, которые не сертифицированы GitHub.
# Они предоставляются сторонним поставщиком, и на них распространяются
# отдельные условия обслуживания, политика конфиденциальности и поддержка
# документации.
# GitHub рекомендует закрепить действия в фиксации SHA.
# Чтобы получить более новую версию, потребуется обновить SHA.
# Вы также можете ссылаться на тег или ветвь, однако действие может измениться без предупреждения.
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registry:
name: Push Docker image to Docker Hub
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: Log in to Docker Hub
uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
images: my-docker-hub-namespace/my-docker-hub-repository
- name: Build and push Docker image
uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
Приведенный выше рабочий процесс извлекает репозиторий GitHub, использует login-action
для входа в реестр, а затем использует действие build-push-action
для создания образа Docker на основе Dockerfile
репозитория, отправки образа в Docker Hub и применения тега к образу.
Публикация образов в GitHub Packages
Каждый раз при создании выпуска в GitHub можно активировать рабочий процесс для публикации образа. Рабочий процесс в приведенном ниже примере выполняется при активации события release
с типом действия created
. Дополнительные сведения о событии см. в release
разделе События, инициирующие рабочие процессы.
В приведенном ниже примере рабочего процесса мы используем действия Docker login-action
, metadata-action
и build-push-action
для сборки образа Docker и, если сборка выполнена успешно, отправляем собранный образ в GitHub Packages.
Ниже приведены параметры login-action
, необходимые для GitHub Packages.
-
registry
: необходимо задать значениеghcr.io
. -
username
: можно использовать контекст${{ github.actor }}
для автоматического использования имени пользователя, активировавшего выполнение рабочего процесса. Дополнительные сведения см. в разделе Контексты. -
password
: для пароля можно использовать автоматически созданный секретGITHUB_TOKEN
. Дополнительные сведения см. в разделе Автоматическая проверка подлинности токенов.Ниже приведен параметр
metadata-action
, необходимый для GitHub Packages. -
images
: пространство имен и имя образа Docker, который вы собираете.
Ниже приведены параметры build-push-action
, необходимые для GitHub Packages..
-
context
: определяет контекст сборки как набор файлов, расположенных по указанному пути. -
push
: если задано значениеtrue
, в случае успешной сборки образ будет отправлен в реестр. -
tags
иlabels
: заполняются выходными данными изmetadata-action
.YAML
Этот рабочий процесс использует действия, которые не сертифицированы GitHub.
Они предоставляются сторонним поставщиком, и на них распространяются
отдельные условия обслуживания, политика конфиденциальности и поддержка
документации.
GitHub рекомендует закрепить действия в фиксации SHA.
Чтобы получить более новую версию, потребуется обновить SHA.
Вы также можете ссылаться на тег или ветвь, однако действие может измениться без предупреждения.
name: Create and publish a Docker image
on: push: branches: ['release']
env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }}
jobs: build-and-push-image: runs-on: ubuntu-latest permissions: contents: read packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Log in to the Container registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Build and push Docker image
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
Приведенный выше рабочий процесс активируется отправкой в ветвь «выпуска». Он извлекает репозиторий GitHub и использует `login-action` для входа в Container registry. Затем он извлекает метки и теги для образа Docker. Наконец, он использует действие `build-push-action` для сборки образа и его публикации на Container registry.
## Публикация образов в Docker Hub и GitHub Packages
В одном рабочем процессе образ Docker можно опубликовать в нескольких реестрах с помощью действий `login-action` и `build-push-action` для каждого реестра.
В следующем примере рабочего процесса используются шаги из предыдущих разделов («[Публикация образов в Docker Hub](#publishing-images-to-docker-hub)» и «[Публикация образов в GitHub Packages](#publishing-images-to-github-packages)») для создания одного рабочего процесса, который выполняет отправку в оба реестра.
```yaml{:copy}
# Этот рабочий процесс использует действия, которые не сертифицированы GitHub.
# Они предоставляются сторонним поставщиком, и на них распространяются
# отдельные условия обслуживания, политика конфиденциальности и поддержка
# документации.
# GitHub рекомендует закрепить действия в фиксации SHA.
# Чтобы получить более новую версию, потребуется обновить SHA.
# Вы также можете ссылаться на тег или ветвь, однако действие может измениться без предупреждения.
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registries:
name: Push Docker image to multiple registries
runs-on: ubuntu-latest
permissions:
packages: write
contents: read
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: Log in to Docker Hub
uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Log in to the Container registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
images: |
my-docker-hub-namespace/my-docker-hub-repository
ghcr.io/${{ github.repository }}
- name: Build and push Docker images
uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
Приведенный выше рабочий процесс извлекает репозиторий GitHub, дважды использует login-action
для входа в оба реестра и создает теги и метки с помощью действия metadata-action
.
Затем действие build-push-action
собирает и отправляет образ Docker в Docker Hub и Container registry.