{"meta":{"title":"Docker イメージの発行","intro":"このチュートリアルでは、継続的インテグレーション (CI) ワークフローの一部として、Docker Hubや GitHub Packages などのレジストリに Docker イメージを発行する方法について説明します。","product":"GitHub Actions","breadcrumbs":[{"href":"/ja/enterprise-cloud@latest/actions","title":"GitHub Actions"},{"href":"/ja/enterprise-cloud@latest/actions/tutorials","title":"チュートリアル"},{"href":"/ja/enterprise-cloud@latest/actions/tutorials/publish-packages","title":"パッケージの公開"},{"href":"/ja/enterprise-cloud@latest/actions/tutorials/publish-packages/publish-docker-images","title":"Docker イメージの公開"}],"documentType":"article"},"body":"# Docker イメージの発行\n\nこのチュートリアルでは、継続的インテグレーション (CI) ワークフローの一部として、Docker Hubや GitHub Packages などのレジストリに Docker イメージを発行する方法について説明します。\n\n## はじめに\n\nこのガイドでは、Docker ビルドを実行し、Docker イメージを Docker Hub または GitHub Packages に発行するワークフローを作成する方法について説明します。 1つのワークフローで、1つのレジストリあるいは複数のレジストリにイメージを公開できます。\n\n> \\[!NOTE]\n> 別のサードパーティの Docker レジストリにプッシュする場合は、「[イメージをGitHub Packagesに発行する](#publishing-images-to-github-packages)」セクションの例を適切なテンプレートとして使用できます。\n\n## 前提条件\n\nワークフローの設定オプションと、ワークフローファイルの作成方法についての基本的な知識を持っておくことを推奨しています。 詳しくは、「[ワークフローの書き込み](/ja/enterprise-cloud@latest/actions/learn-github-actions)」をご覧ください。\n\n以下についての基本的な理解があると役に立つでしょう。\n\n* [GitHub Actions でのシークレットの使用](/ja/enterprise-cloud@latest/actions/security-guides/using-secrets-in-github-actions)\n* [ワークフローでの認証に GITHUB\\_TOKEN を使用する](/ja/enterprise-cloud@latest/actions/security-guides/automatic-token-authentication)\n* [コンテナレジストリの利用](/ja/enterprise-cloud@latest/packages/working-with-a-github-packages-registry/working-with-the-container-registry)\n\n## イメージの設定について\n\nこのガイドでは、 GitHub リポジトリに格納されている Docker イメージの完全な定義があることを前提としています。 たとえば、リポジトリにはイメージを作成するための Docker の構築を行うのに必要な *Dockerfile* やその他のファイルが含まれていなければなりません。\n\n```\n          定義済みの注釈キーを使って、説明、ライセンス、ソース リポジトリなどのメタデータをコンテナー イメージに追加できます。 詳細については、 [AUTOTITLE を](/packages/working-with-a-github-packages-registry/working-with-the-container-registry#labelling-container-images)参照してください。\n```\n\nこのガイドでは、Docker `build-push-action` アクションを使用して Docker イメージを構築し、1 つまたは複数の 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 と Docker の間の同意に基づくこれらの制限は、GitHub ホステッド ランナーには適用されません。\n\n```\n          GitHubで新しいリリースを作成するたびに、ワークフローをトリガーしてイメージを発行できます。 次の例のワークフローは、`release` イベントが `published` アクティビティの種類でトリガーされたときに実行されます。\n```\n\n次のワークフロー例では、Docker `login-action` アクションと `build-push-action` アクションを使用して Docker イメージをビルドし、ビルドが成功した場合はビルドされたイメージをDocker Hubにプッシュします。\n\nDocker Hubにプッシュするには、Docker Hub アカウントを用意し、Docker Hub リポジトリを作成する必要があります。 詳細については、Docker ドキュメントの「[ Docker コンテナー イメージをDocker Hub](https://docs.docker.com/docker-hub/quickstart/#step-3-build-and-push-an-image-to-docker-hub)に適用する」を参照してください。\n\nDocker Hubに必要な `login-action` オプションは次のとおりです。\n\n* `username` と `password`: これはDocker Hubのユーザー名とパスワードです。 Docker Hubユーザー名とパスワードをシークレットとして保存して、ワークフロー ファイルに公開しないようにすることをお勧めします。 詳しくは、「[GitHub Actions でのシークレットの使用](/ja/enterprise-cloud@latest/actions/security-guides/using-secrets-in-github-actions)」をご覧ください。\n\nDocker Hubに必要な `metadata-action` オプションは次のとおりです。\n\n* `images`: Docker Hub にビルドまたはプッシュする Docker イメージの名前空間と名前。\n\nDocker 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` アクションを使用して、リポジトリの `Dockerfile` に基づいて Docker イメージを構築します。イメージをDocker Hubにプッシュし、画像にタグを適用します。\n\n最後の手順では、イメージのアーティファクト構成証明が生成され、サプライ チェーンのセキュリティを強化します。 詳しくは、「[アーティファクトの構成証明を使用してビルドの出所を確立する](/ja/enterprise-cloud@latest/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds)」をご覧ください。\n\n## イメージを公開 GitHub Packages\n\n```\n          GitHubで新しいリリースを作成するたびに、ワークフローをトリガーしてイメージを発行できます。 次の例のワークフローは、変更が `release` ブランチにプッシュされたときに実行されます。　\n```\n\n次のワークフロー例では、Docker `login-action`、 `metadata-action`、 、 `build-push-action` アクションを使用して Docker イメージをビルドし、ビルドが成功した場合は、ビルドされたイメージを GitHub Packagesにプッシュします。\n\n```\n          `login-action`に必要なGitHub Packagesオプションは次のとおりです。\n```\n\n* `registry`: `ghcr.io`に設定する必要があります。\n\n* `username`: `${{ github.actor }}` コンテキストを使用して、ワークフローの実行をトリガーしたユーザーのユーザー名を自動的に使用できます。 詳しくは、「[コンテキスト リファレンス](/ja/enterprise-cloud@latest/actions/learn-github-actions/contexts#github-context)」をご覧ください。\n\n* `password`: 自動的に生成された `GITHUB_TOKEN` シークレットをパスワードに使用できます。 詳しくは、「[ワークフローでの認証に GITHUB\\_TOKEN を使用する](/ja/enterprise-cloud@latest/actions/security-guides/automatic-token-authentication)」をご覧ください。\n\n  ```\n          `metadata-action`に必要なGitHub Packages オプションは次のとおりです。\n  ```\n\n* `images`: 構築する Docker イメージの名前空間と名前。\n\n  ```\n          `build-push-action`に必要なGitHub Packagesオプションは次のとおりです。\n  ```\n\n* `context`: ビルドのコンテキストを、指定したパスにあるファイルのセットとして定義します。\n\n* `push`: `true`に設定すると、イメージが正常にビルドされるとレジストリにプッシュされます。\n\n* `tags`\n  `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単一のワークフローで、各レジストリに対して `login-action` および `build-push-action` アクションを使用して、Docker イメージを複数のレジストリに公開できます。\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` を 2 回使用して両方のレジストリにログインし、 `metadata-action` アクションを使用してタグとラベルを生成します。\nその後、`build-push-action` アクションによって Docker イメージがビルドされ、Docker HubとContainer registryにプッシュされます。\n\n> \\[!NOTE]\n> 複数のレジストリにプッシュする場合:\n>\n> * イメージ ダイジェストはレジストリによって異なる場合があり、構成証明の検証が困難になります。\n> * 一貫性のあるダイジェストを維持し、1 つの構成証明ですべてのコピーを検証できるようにするには、まず 1 つのレジストリにプッシュし、 [`crane copy`](https://github.com/google/go-containerregistry/blob/main/cmd/crane/doc/crane_copy.md) などのツールを使用して別の場所にイメージをレプリケートします。\n> * 代わりに各レジストリを個別にビルドしてプッシュする場合は、成果物を検証可能な状態に保つには、それぞれに個別の構成証明を生成する必要があります。\n\n## ハンズオン プラクティス\n\nDocker イメージの発行に関する[Docker イメージ発行](https://github.com/skills/publish-docker-images)GitHub Skillsの演習を行います。\n\nこの演習では、次の方法を学習します。\n\n* GitHub Packagesを使用して`GITHUB_TOKEN`に対して認証します。\n* コンテナー イメージをビルドして Container registry に発行します (`ghcr.io`)。\n* `docker/login-action`、`docker/build-push-action`、`docker/setup-buildx-action`などの公式の Docker アクションを使用します。\n* ブランチ、プル要求、リリースに基づいて、 `docker/metadata-action` を使用してタグを自動的に生成します。\n* 適切なコンテナーのバージョン管理を使用して、機能、プル要求、リリースを作成します。"}