Skip to main content
Мы публикуем частые обновления нашей документации, и перевод этой страницы может все еще выполняться. Актуальные сведения см. в документации на английском языке.

Публикация образов Docker

Образы Docker можно публиковать в реестре, например Docker Hub или GitHub Packages, в рамках рабочего процесса непрерывной интеграции (CI).

Примечание. В GitHub Enterprise Server в настоящее время не поддерживаются средства выполнения тестов, размещенные в GitHub. Дополнительные сведения о планируемой поддержке в будущем см. в GitHub public roadmap.

Введение

В этом руководстве показано, как создать рабочий процесс, который выполняет сборку Docker, а затем публикует образы Docker в Docker Hub или GitHub Packages. С помощью одного рабочего процесса можно публиковать образы в одном или нескольких реестрах.

Примечание. Если требуется выполнить отправку в другой сторонний реестр Docker, пример в разделе «Публикация образов в GitHub Packages» может послужить хорошим шаблоном.

Предварительные требования

Рекомендуется иметь базовое представление о параметрах конфигурации рабочих процессов, а также о том, как создавать файл рабочего процесса. Дополнительные сведения см. в разделе Изучение GitHub Actions.

Кроме того, могут быть полезны базовые знания в следующих областях:

Сведения о конфигурации образа

В этом руководстве предполагается, что у вас имеется полное определение образа Docker, хранящегося в репозитории GitHub. Например, репозиторий должен содержать Dockerfile и все остальные файлы, необходимые для выполнения сборки Docker и создания образа.

Вы можете использовать предварительно определенные ключи заметок для добавления метаданных, включая описание, лицензию и исходный репозиторий, в образ контейнера. Дополнительные сведения см. в разделе Работа с реестром контейнеров.

В этом руководстве мы будем использовать действие build-push-action Docker для сборки образа Docker и отправки его в один или несколько реестров Docker. Дополнительные сведения см. на веб-сайте build-push-action.

Примечание. GitHub Actions в экземпляр GitHub Enterprise Server может иметь ограниченный доступ к действиям в GitHub.com или GitHub Marketplace. Дополнительные сведения см. в разделе Управление доступом к действиям с сайта GitHub.com и обратитесь к администратору сайта GitHub Enterprise.

Публикация образов в Docker Hub

Каждый раз при создании выпуска в GitHub Enterprise Server можно активировать рабочий процесс для публикации образа. Рабочий процесс в приведенном ниже примере выполняется при активации события 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, образ будет отправлен в реестр в случае успешной сборки.
YAML
# Этот рабочий процесс использует действия, которые не сертифицированы 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: [self-hosted]
    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

Примечание. Сейчас Container registry для GitHub Enterprise Server доступен в бета-версии и может быть изменен.

Для использования Container registry необходимо включить GitHub Packages и изоляцию поддоменов. Дополнительные сведения см. в разделе Работа с реестром контейнеров.

Каждый раз при создании выпуска в GitHub Enterprise Server можно активировать рабочий процесс для публикации образа. Рабочий процесс в приведенном ниже примере выполняется при активации события release с типом действия created. Дополнительные сведения о событии см. в release разделе События, инициирующие рабочие процессы.

В приведенном ниже примере рабочего процесса мы используем действия Docker login-action и build-push-action для сборки образа Docker и, если сборка выполнена успешно, отправляем собранный образ в GitHub Packages.

Ниже приведены параметры login-action, необходимые для GitHub Packages.

  • registry: необходимо задать значение containers.HOSTNAME.
  • username: можно использовать контекст ${{ github.actor }} для автоматического использования имени пользователя, активировавшего выполнение рабочего процесса. Дополнительные сведения см. в разделе Контексты.
  • password: для пароля можно использовать автоматически созданный секрет GITHUB_TOKEN. Дополнительные сведения см. в разделе Автоматическая проверка подлинности токенов.

Ниже приведены параметры build-push-action, необходимые для GitHub Packages.

  • push: если задано значение true, в случае успешной сборки образ будет отправлен в реестр.

  • tags: необходимо задать в формате containers.HOSTNAME/OWNER/REPOSITORY/IMAGE_NAME:VERSION.

    Например, для образа с именем octo-image, хранящегося на GitHub Enterprise Server в https://HOSTNAME/octo-org/octo-repo, для параметра tags необходимо задать значение containers.HOSTNAME/octo-org/octo-repo/octo-image:latest. Можно задать один тег, как показано ниже, или указать несколько тегов в виде списка.

    YAML

Этот рабочий процесс использует действия, которые не сертифицированы GitHub.

Они предоставляются сторонним поставщиком, и на них распространяются

отдельные условия обслуживания, политика конфиденциальности и поддержка

документации.

GitHub рекомендует закрепить действия в фиксации SHA.

Чтобы получить более новую версию, потребуется обновить SHA.

Вы также можете ссылаться на тег или ветвь, однако действие может измениться без предупреждения.

name: Create and publish a Docker image

on: push: branches: ['release']

env: REGISTRY: containers.HOSTNAME IMAGE_NAME: ${{ github.repository }}

jobs: build-and-push-image: runs-on: [self-hosted] 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

 

<div class="extended-markdown note border rounded-1 mb-4 p-3 color-border-accent-emphasis color-bg-accent f5">

**Примечание**. Сейчас Container registry для GitHub Enterprise Server доступен в бета-версии и может быть изменен. 

Для использования Container registry необходимо включить GitHub Packages и изоляцию поддоменов. Дополнительные сведения см. в разделе [AUTOTITLE](/packages/working-with-a-github-packages-registry/working-with-the-container-registry).

</div>

 

В одном рабочем процессе образ 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: [self-hosted]
    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: containers.HOSTNAME
          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
            containers.HOSTNAME/${{ 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 Enterprise Server, дважды использует login-action для входа в оба реестра и создает теги и метки с помощью действия metadata-action. Затем действие build-push-action собирает и отправляет образ Docker в Docker Hub и Container registry.