{"meta":{"title":"Публикация образов Docker","intro":"В этом уроке вы узнаете, как публиковать образы Docker в реестр, такой как Docker Hub или GitHub Packages, как часть вашего рабочего процесса непрерывной интеграции (CI).","product":"GitHub Actions","breadcrumbs":[{"href":"/ru/actions","title":"GitHub Actions"},{"href":"/ru/actions/tutorials","title":"Учебники"},{"href":"/ru/actions/tutorials/publish-packages","title":"Публикация пакетов"},{"href":"/ru/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/actions/learn-github-actions).\n\nКроме того, могут быть полезны базовые знания в следующих областях:\n\n* [Использование секретов в GitHub Actions](/ru/actions/security-guides/using-secrets-in-github-actions)\n* [Использование GITHUB\\_TOKEN для проверки подлинности в рабочих процессах](/ru/actions/security-guides/automatic-token-authentication)\n* [Работа с реестром контейнеров](/ru/packages/working-with-a-github-packages-registry/working-with-the-container-registry)\n\n## Сведения о конфигурации образа\n\nЭто руководство предполагает, что у вас есть полное определение образа Docker, хранящегося в GitHub репозитории. Например, репозиторий должен содержать *Dockerfile* и все остальные файлы, необходимые для выполнения сборки Docker и создания образа.\n\n```\n          Вы можете использовать предварительно определенные ключи заметки для добавления метаданных, включая описание, лицензию и исходный репозиторий в образ контейнера. Для получения дополнительной информации см. [AUTOTITLE](/packages/working-with-a-github-packages-registry/working-with-the-container-registry#labelling-container-images).\n```\n\nВ этом руководстве мы будем использовать действие `build-push-action` Docker для сборки образа Docker и отправки его в один или несколько реестров Docker. Дополнительные сведения см. в статье [`build-push-action`](https://github.com/marketplace/actions/build-and-push-docker-images).\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/actions/security-guides/using-secrets-in-github-actions).\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: ubuntu-latest\n    permissions:\n      packages: write\n      contents: read\n      attestations: write\n      id-token: write\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      - name: Generate artifact attestation\n        uses: actions/attest@v4\n        with:\n          subject-name: index.docker.io/my-docker-hub-namespace/my-docker-hub-repository\n          subject-digest: ${{ steps.push.outputs.digest }}\n          push-to-registry: true\n```\n\nВышеуказанный рабочий процесс проверяет репозиторий GitHub, использует `login-action` для входа в реестр, а затем использует действие `build-push-action`, чтобы: создать образ Docker на основе `Dockerfile` вашего репозитория; Отправьте изображение в Docker Hub и примените к образу тег.\n\nНа последнем шаге создается аттестация артефактов для образа, что повышает безопасность цепочки поставок. Дополнительные сведения см. в разделе [Использование аттестаций артефактов для установления происхождения сборок](/ru/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds).\n\n## Публикация изображений для GitHub Packages\n\nКаждый раз, когда вы создаёте новый релиз на GitHub, вы можете запускать рабочий процесс для публикации вашего изображения. Рабочий процесс в приведенном ниже примере выполняется при отправке изменения в `release` ветвь.\n\nВ приведённом ниже примере рабочего процесса мы используем Docker `login-action`, `metadata-action`, и `build-push-action` действия для создания образа Docker, и если сборка успешна, отправляем созданный образ в GitHub Packages.\n\nТребуемые `login-action` варианты следующие GitHub Packages :\n\n* `registry`: Должно быть установлено на `ghcr.io``ghcr.io`.\n* `username`: Вы можете использовать `${{ github.actor }}` контекст, чтобы автоматически использовать имя пользователя, запустившего запуск рабочего процесса. Дополнительные сведения см. в разделе [Справочник по контекстам](/ru/actions/learn-github-actions/contexts#github-context).\n* `password`: для пароля можно использовать автоматически созданный секрет `GITHUB_TOKEN`. Дополнительные сведения см. в разделе [Использование GITHUB\\_TOKEN для проверки подлинности в рабочих процессах](/ru/actions/security-guides/automatic-token-authentication).\n\nТребуемый `metadata-action` вариант для GitHub Packages следующего:\n\n* `images`: пространство имен и имя образа Docker, который вы собираете.\n\nТребуемые `build-push-action` варианты следующие GitHub Packages :\n\n* `context`: Определяет контекст сборки как набор файлов, расположенных в указанном пути.\n* `push`: Если установлено на `true`, изображение будет отправлено в реестр, если оно успешно собрано.\n* `tags` и `labels`: Они заполняются выходами из `metadata-action`.\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: ghcr.io\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: ubuntu-latest\n    # Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job.\n    permissions:\n      contents: read\n      packages: write\n      attestations: write\n      id-token: write\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      # This step generates an artifact attestation for the image, which is an unforgeable statement about where and how it was built. It increases supply chain security for people who consume the image. For more information, see [Using artifact attestations to establish provenance for builds](/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds).\n      - name: Generate artifact attestation\n        uses: actions/attest@v4\n        with:\n          subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}}\n          subject-digest: ${{ steps.push.outputs.digest }}\n          push-to-registry: true\n      \n```\n\nПриведенный выше рабочий процесс активируется отправкой в ветвь «выпуска». Он проверяет репозиторий GitHub и использует `login-action` для входа в Container registry. Затем он извлекает метки и теги для образа Docker. Наконец, он использует `build-push-action` действие для создания изображения и публикации его на Container registry.\n\n## Публикация изображений для Docker Hub и GitHub Packages\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: ubuntu-latest\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: ghcr.io\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            ghcr.io/${{ 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> \\[!NOTE]\n> При переводе в несколько реестров:\n>\n> * Дайджесты изображений могут различаться в зависимости от реестра, что затрудняет проверку заверок.\n> * Чтобы поддерживать единый дайджест и позволить одной аттестации проверять все копии, сначала отправьте в один реестр и используйте инструмент, например [`crane copy`](https://github.com/google/go-containerregistry/blob/main/cmd/crane/doc/crane_copy.md) , для повторения изображения в другом месте.\n> * Если вы решите создавать и отправлять данные в каждый реестр отдельно, вам нужно создать отдельное подтверждение для каждого, чтобы ваши артефакты оставались проверяемыми.\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-запросы и релизы с правильным версионированием контейнеров."}