{"meta":{"title":"Публикация образов Docker","intro":"В этом уроке вы узнаете, как публиковать образы Docker в реестр, такой как Docker Hub или GitHub Packages, как часть вашего рабочего процесса непрерывной интеграции (CI).","product":"GitHub Actions","breadcrumbs":[{"href":"/ru/enterprise-server@3.17/actions","title":"GitHub Actions"},{"href":"/ru/enterprise-server@3.17/actions/tutorials","title":"Учебники"},{"href":"/ru/enterprise-server@3.17/actions/tutorials/publish-packages","title":"Публикация пакетов"},{"href":"/ru/enterprise-server@3.17/actions/tutorials/publish-packages/publish-docker-images","title":"Публикация образов Docker"}],"documentType":"article"},"body":"# Публикация образов Docker\n\nВ этом уроке вы узнаете, как публиковать образы Docker в реестр, такой как Docker Hub или GitHub Packages, как часть вашего рабочего процесса непрерывной интеграции (CI).\n\n## Введение\n\nВ этом руководстве показано, как создать рабочий процесс, который выполняет сборку Docker, а затем публикует образы Docker в Docker Hub или GitHub Packages. С помощью одного рабочего процесса можно публиковать образы в одном или нескольких реестрах.\n\n> \\[!NOTE]\n> Если вы хотите отправить в другой сторонний реестр Docker, пример из [раздела «Публикация изображений» GitHub Packages](#publishing-images-to-github-packages) может послужить хорошим шаблоном.\n\n## Необходимые компоненты\n\nРекомендуется иметь базовое представление о параметрах конфигурации рабочих процессов, а также о том, как создавать файл рабочего процесса. Дополнительные сведения см. в разделе [Написание рабочих процессов](/ru/enterprise-server@3.17/actions/how-tos/write-workflows).\n\nКроме того, могут быть полезны базовые знания в следующих областях:\n\n* [Использование секретов в GitHub Actions](/ru/enterprise-server@3.17/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)\n* [Использование GITHUB\\_TOKEN для проверки подлинности в рабочих процессах](/ru/enterprise-server@3.17/actions/tutorials/authenticate-with-github_token)\n* [Работа с реестром Docker](/ru/enterprise-server@3.17/packages/working-with-a-github-packages-registry/working-with-the-docker-registry)\n\n## Сведения о конфигурации образа\n\nЭто руководство предполагает, что у вас есть полное определение образа Docker, хранящегося в GitHub репозитории. Например, репозиторий должен содержать *Dockerfile* и все остальные файлы, необходимые для выполнения сборки Docker и создания образа.\n\nВы можете использовать предварительно определенные ключи заметки для добавления метаданных, включая описание, лицензию и исходный репозиторий в образ контейнера. Для получения дополнительной информации см. [Работа с реестром контейнеров](/ru/enterprise-server@3.17/packages/working-with-a-github-packages-registry/working-with-the-container-registry#labelling-container-images).\n\nВ этом руководстве мы будем использовать действие `build-push-action` Docker для сборки образа Docker и отправки его в один или несколько реестров Docker. Дополнительные сведения см. в статье [`build-push-action`](https://github.com/marketplace/actions/build-and-push-docker-images).\n\n> \\[!NOTE]\n> GitHub Actions При GitHub Enterprise Server этом может быть ограниченный доступ к действиям или GitHub.comGitHub Marketplaceдействиям. Дополнительные сведения см. в разделе [Управление доступом к действиям GitHub.com](/ru/enterprise-server@3.17/admin/managing-github-actions-for-your-enterprise/managing-access-to-actions-from-githubcom) и обратитесь к администратору GitHub Enterprise сайта.\n\n## Публикация изображений в Docker Hub\n\n> \\[!NOTE]\n> Docker Hub обычно накладывает ограничения скорости для операций отправки и извлечения, которые повлияют на задания на локальных запусках. Однако GitHub, размещенные в runner, не подлежат этим ограничениям на основе соглашения между переменными данных.product.github %} и Docker.\n\nКаждый раз, когда вы создаёте новый релиз на GitHub, вы можете запускать рабочий процесс для публикации вашего изображения. Рабочий процесс в приведенном ниже примере выполняется при активации события `release` с типом действия `published`.\n\nВ примере рабочего процесса ниже мы используем действия Docker `login-action` и `build-push-action` для создания образа Docker и, если сборка успешна, отправляем созданный образ в Docker Hub.\n\nЧтобы перейти в Docker Hub, вам нужно иметь аккаунт Docker Hub и создать репозиторий Docker Hub. Для получения дополнительной информации см. [Pushing a container image of Docker to Docker Hub](https://docs.docker.com/docker-hub/quickstart/#step-3-build-and-push-an-image-to-docker-hub) в документации Docker.\n\nДля Docker Hub требуются варианты `login-action`:\n\n* `username` и `password`: Это ваше Docker Hub логин и пароль. Мы рекомендуем хранить имя пользователя и пароль Docker Hub как секреты, чтобы они не были раскрыты в файле рабочего процесса. Дополнительные сведения см. в разделе [Использование секретов в GitHub Actions](/ru/enterprise-server@3.17/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets).\n\nДля Docker Hub требуется `metadata-action` вариант:\n\n* `images`: Пространство имён и имя для образа Docker, которое вы собираете/отправляете в Docker Hub.\n\nДля Docker Hub требуются варианты `build-push-action`:\n\n* `tags`: тег нового образа в формате `DOCKER-HUB-NAMESPACE/DOCKER-HUB-REPOSITORY:VERSION`. Можно задать один тег, как показано ниже, или указать несколько тегов в виде списка.\n* `push`: если задано значение `true`, образ будет отправлен в реестр в случае успешной сборки.\n\n```yaml copy\n# Этот рабочий процесс использует действия, которые не сертифицированы GitHub.\n# Они предоставляются сторонним поставщиком, и на них распространяются\n# отдельные условия обслуживания, политика конфиденциальности и поддержка\n# документации.\n\n# GitHub рекомендует закрепить действия в фиксации SHA.\n# Чтобы получить более новую версию, потребуется обновить SHA.\n# Вы также можете ссылаться на тег или ветвь, однако действие может измениться без предупреждения.\n\nname: Publish Docker image\n\non:\n  release:\n    types: [published]\n\njobs:\n  push_to_registry:\n    name: Push Docker image to Docker Hub\n    runs-on: [self-hosted]\n    permissions:\n      packages: write\n      contents: read\n      \n      \n    steps:\n      - name: Check out the repo\n        uses: actions/checkout@v6\n\n      - name: Log in to Docker Hub\n        uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a\n        with:\n          username: ${{ secrets.DOCKER_USERNAME }}\n          password: ${{ secrets.DOCKER_PASSWORD }}\n\n      - name: Extract metadata (tags, labels) for Docker\n        id: meta\n        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7\n        with:\n          images: my-docker-hub-namespace/my-docker-hub-repository\n\n      - name: Build and push Docker image\n        id: push\n        uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671\n        with:\n          context: .\n          file: ./Dockerfile\n          push: true\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n\n```\n\nВышеуказанный рабочий процесс проверяет репозиторий GitHub, использует `login-action` для входа в реестр, а затем использует действие `build-push-action`, чтобы: создать образ Docker на основе `Dockerfile` вашего репозитория; Отправьте изображение в Docker Hub и примените к образу тег.\n\n## Публикация изображений для GitHub Packages\n\n> \\[!NOTE] Container registry в настоящее время находится в Публичный предварительный просмотр для GitHub Enterprise Server и подлежит изменению.\n\nДля использования GitHub Packages необходимо включить Container registry и изоляцию поддоменов. Дополнительные сведения см. в разделе [Работа с реестром контейнеров](/ru/enterprise-server@3.17/packages/working-with-a-github-packages-registry/working-with-the-container-registry).\n\nКаждый раз, когда вы создаёте новый релиз на GitHub, вы можете запускать рабочий процесс для публикации вашего изображения. Рабочий процесс в приведенном ниже примере выполняется при отправке изменения в `release` ветвь.\n\nВ приведённом ниже примере рабочего процесса мы используем Docker `login-action` и `build-push-action` действия для создания образа Docker, и если сборка успешна, отправляем созданный образ в GitHub Packages.\n\nТребуемые `login-action` варианты следующие GitHub Packages :\n\n* `registry`: Должно быть установлено на `containers. HOSTNAME`.\n* `username`: Вы можете использовать `${{ github.actor }}` контекст, чтобы автоматически использовать имя пользователя, запустившего запуск рабочего процесса. Дополнительные сведения см. в разделе [Справочник по контекстам](/ru/enterprise-server@3.17/actions/reference/workflows-and-actions/contexts#github-context).\n* `password`: для пароля можно использовать автоматически созданный секрет `GITHUB_TOKEN`. Дополнительные сведения см. в разделе [Использование GITHUB\\_TOKEN для проверки подлинности в рабочих процессах](/ru/enterprise-server@3.17/actions/tutorials/authenticate-with-github_token).\n\nТребуемые `build-push-action` варианты следующие GitHub Packages :\n\n* `push`: Если установлено на `true`, изображение будет отправлено в реестр, если оно успешно собрано.\n* `tags`: необходимо задать в формате `containers. HOSTNAME/OWNER/REPOSITORY/IMAGE_NAME:VERSION`.\n\n  Например, для изображения с именем `octo-image` , хранящегося в GitHub Enterprise Server`https://HOSTNAME/octo-org/octo-repo`, `tags` опция должна быть установлена на `containers. HOSTNAME/octo-org/octo-repo/octo-image:latest` . Вы можете установить один тег, как показано ниже, или указать несколько тегов в списке.\n\n> \\[!NOTE]\n>\n> * Этот рабочий процесс использует действия, которые не сертифицированы GitHub. Они предоставляются сторонними лицами и управляются отдельными условиями обслуживания, политикой конфиденциальности и документацией по поддержке.\n> * GitHub рекомендует закреплять действия с фиксацией SHA. Чтобы получить более новую версию, потребуется обновить SHA. Вы также можете ссылаться на тег или ветвь, однако действие может измениться без предупреждения.\n\n```yaml annotate copy\n#\nname: Create and publish a Docker image\n\n# Configures this workflow to run every time a change is pushed to the branch called `release`.\non:\n  push:\n    branches: ['release']\n\n# Defines two custom environment variables for the workflow. These are used for the Container registry domain, and a name for the Docker image that this workflow builds.\nenv:\n  REGISTRY: containers. HOSTNAME\n  IMAGE_NAME: ${{ github.repository }}\n\n# There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu.\njobs:\n  build-and-push-image:\n    runs-on: [self-hosted]\n    # Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job.\n    permissions:\n      contents: read\n      packages: write\n      \n      \n      #\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n      # Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here.\n      - name: Log in to the Container registry\n        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1\n        with:\n          registry: ${{ env.REGISTRY }}\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n      # This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` \"meta\" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels.\n      - name: Extract metadata (tags, labels) for Docker\n        id: meta\n        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7\n        with:\n          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}\n      # This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages.\n      # It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see [Usage](https://github.com/docker/build-push-action#usage) in the README of the `docker/build-push-action` repository.\n      # It uses the `tags` and `labels` parameters to tag and label the image with the output from the \"meta\" step.\n      - name: Build and push Docker image\n        id: push\n        uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4\n        with:\n          context: .\n          push: true\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n      \n```\n\nПриведенный выше рабочий процесс активируется отправкой в ветвь «выпуска». Он проверяет репозиторий GitHub и использует `login-action` для входа в Container registry. Затем он извлекает метки и теги для образа Docker. Наконец, он использует `build-push-action` действие для создания изображения и публикации его на Container registry.\n\n## Публикация изображений для Docker Hub и GitHub Packages\n\n> \\[!NOTE] Container registry в настоящее время находится в Публичный предварительный просмотр для GitHub Enterprise Server и подлежит изменению.\n\nДля использования GitHub Packages необходимо включить Container registry и изоляцию поддоменов. Дополнительные сведения см. в разделе [Работа с реестром контейнеров](/ru/enterprise-server@3.17/packages/working-with-a-github-packages-registry/working-with-the-container-registry).\n\nВ одном рабочем процессе образ Docker можно опубликовать в нескольких реестрах с помощью действий `login-action` и `build-push-action` для каждого реестра.\n\nСледующий пример рабочего процесса использует шаги из предыдущих разделов ([Публикация образов в Docker Hub](#publishing-images-to-docker-hub) и [Публикация изображений в GitHub Packages](#publishing-images-to-github-packages)) для создания единого рабочего процесса, который отправляется в оба реестра.\n\n```yaml copy\n# Этот рабочий процесс использует действия, которые не сертифицированы GitHub.\n# Они предоставляются сторонним поставщиком, и на них распространяются\n# отдельные условия обслуживания, политика конфиденциальности и поддержка\n# документации.\n\n# GitHub рекомендует закрепить действия в фиксации SHA.\n# Чтобы получить более новую версию, потребуется обновить SHA.\n# Вы также можете ссылаться на тег или ветвь, однако действие может измениться без предупреждения.\n\nname: Publish Docker image\n\non:\n  release:\n    types: [published]\n\njobs:\n  push_to_registries:\n    name: Push Docker image to multiple registries\n    runs-on: [self-hosted]\n    permissions:\n      packages: write\n      contents: read\n    steps:\n      - name: Check out the repo\n        uses: actions/checkout@v6\n\n      - name: Log in to Docker Hub\n        uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a\n        with:\n          username: ${{ secrets.DOCKER_USERNAME }}\n          password: ${{ secrets.DOCKER_PASSWORD }}\n\n      - name: Log in to the Container registry\n        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1\n        with:\n          registry: containers. HOSTNAME\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Extract metadata (tags, labels) for Docker\n        id: meta\n        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7\n        with:\n          images: |\n            my-docker-hub-namespace/my-docker-hub-repository\n            containers. HOSTNAME/${{ github.repository }}\n\n      - name: Build and push Docker images\n        id: push\n        uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671\n        with:\n          context: .\n          push: true\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n```\n\nВышеуказанный рабочий процесс проверяет репозиторий GitHub , использует `login-action` twice для входа в оба реестра и генерирует теги и метки с помощью действия `metadata-action` .\nЗатем действие `build-push-action` строит изображение Docker в Docker Hub и Container registry.\n\n## Отработка практических навыков\n\nПрактикуйте публикацию изображений Docker с помощью упражнения [Publishing Docker images](https://github.com/skills/publish-docker-images)GitHub Skills .\n\nВ этом упражнении вы узнаете, как:\n\n* Аутентифицировать с GitHub Packages использованием `GITHUB_TOKEN`.\n* Создайте и опубликуйте изображения контейнеров в Container registry (`ghcr.io`).\n* Используйте официальные действия Docker, такие `docker/login-action`как , `docker/build-push-action`и `docker/setup-buildx-action`.\n* Генерируйте теги автоматически на `docker/metadata-action` основе ветвей, пулл-запросов и релизов.\n* Создавайте функции, pull-запросы и релизы с правильным версионированием контейнеров."}