はじめに
このガイドでは、Dockerのビルドを実行し、DockerのイメージをDocker HubあるいはGitHub Packagesに公開するワークフローの作成方法を紹介します。 1つのワークフローで、1つのレジストリあるいは複数のレジストリにイメージを公開できます。
ノート: 他のサードパーティのDockerレジストリにプッシュしたい場合は、「GitHub Packagesへのイメージの公開」セクションにある例がよいテンプレートになるでしょう。
必要な環境
ワークフローの設定オプションと、ワークフローファイルの作成方法についての基本的な知識を持っておくことをおすすめします。 詳しい情報については、「GitHub Actions を学ぶ」を参照してください。
以下についての基本的な理解があると役に立つでしょう。
イメージの設定について
このガイドは、GitHubリポジトリ内に保存されたDockerのイメージについての完全な定義を持っていることを前提としています。 たとえば、リポジトリにはイメージを作成するためのDockerビルドを行うのに必要なDockerfileやその他のファイルが含まれていなければなりません。
このガイドではDockerのbuild-push-action
アクションを使って、Dockerイメージをビルドし、それを1つ以上のDockerレジストリにプッシュします。 詳しい情報についてはbuild-push-action
を参照してください。
Docker Hubへのイメージの公開
GitHub Enterprise Cloud上で新しいリリースを作成するたびに、イメージを公開するワークフローを起動できます。 以下の例のワークフローは、created
というアクティビティの種類を持つrelease
イベントが生じた時に実行されます。 release
イベントに関する詳しい情報については「ワークフローを起動するイベント」を参照してください。
以下のワークフロー例では、Docker の login-action
アクションと build-push-action
アクションを使用して Docker イメージをビルドし、ビルドが成功すればそのイメージを Docker Hub にプッシュします。
Docker Hubにプッシュするためには、Docker Hubのアカウントを持っており、Docker Hubのレジストリを作成していなければなりません。 詳しい情報については、Docker のドキュメントにある「Docker Hub でイメージを共有する」を参照してください。
Docker Hub に必要な login-action
オプションは次のとおりです。
username
及びpassword
: Docker Hubのユーザ名とパスワードです。 ワークフローファイルに公開されないように、Docker Hub のユーザ名とパスワードをシークレットとして保存することをお勧めします。 詳しい情報については、「暗号化されたシークレットの作成と利用」を参照してください。
The metadata-action
option required for Docker Hub is:
images
: The namespace and name for the Docker image you are building/pushing to Docker Hub.
Docker Hubに必要なbuild-push-action
のオプションは以下のとおりです。
tags
:DOCKER-HUB-NAMESPACE/DOCKER-HUB-REPOSITORY:VERSION
の形式の新しいイメージのタグ。 以下のとおり、単一のタグを設定することも、リストに複数のタグを指定することもできます。push
:true
に設定すると、イメージは正常にビルドされた場合にレジストリにプッシュされます。
# このワークフローはGitHubによって認定されていないアクションを使用します。
# それらはサードパーティによって提供され、
# 別個の利用規約、プライバシーポリシー、
# サポートドキュメンテーションが適用されます。
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@f054a8b539a109f9f41c372932f1ae047eff08c9
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
with:
images: my-docker-hub-namespace/my-docker-hub-repository
- name: Build and push Docker image
uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
The above workflow checks out the GitHub repository, uses the login-action
to log in to the registry, and then uses the build-push-action
action to: build a Docker image based on your repository's Dockerfile
; push the image to Docker Hub, and apply a tag to the image.
GitHub Packagesへのイメージの公開
GitHub Enterprise Cloud上で新しいリリースを作成するたびに、イメージを公開するワークフローを起動できます。 以下の例のワークフローは、created
というアクティビティの種類を持つrelease
イベントが生じた時に実行されます。 release
イベントに関する詳しい情報については「ワークフローを起動するイベント」を参照してください。
In the example workflow below, we use the Docker login-action
, metadata-action
, and build-push-action
actions to build the Docker image, and if the build succeeds, push the built image to GitHub Packages.
GitHub Packages に必要な login-action
オプションは次のとおりです。
registry
: Must be set toghcr.io
.username
:${{ github.actor }}
コンテキストを使って、ワークフローの実行を始めたユーザのユーザ名を自動的に使うことができます。 詳細については、「コンテキスト」を参照してください。password
: パスワードには、自動的に生成されたGITHUB_TOKEN
シークレットを利用できます。 詳しい情報については「GITHUB_TOKENでの認証」を参照してください。
The metadata-action
option required for GitHub Packages is:
images
: The namespace and name for the Docker image you are building.
The build-push-action
options required for GitHub Packages are:
context
: Defines the build's context as the set of files located in the specified path.push
: If set totrue
, the image will be pushed to the registry if it is built successfully.tags
andlabels
: These are populated by output frommetadata-action
.
# このワークフローはGitHubによって認定されていないアクションを使用します。
# それらはサードパーティによって提供され、
# 別個の利用規約、プライバシーポリシー、
# サポートドキュメンテーションが適用されます。
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@f054a8b539a109f9f41c372932f1ae047eff08c9
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Build and push Docker image
uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
The above workflow is triggered by a push to the "release" branch. It checks out the GitHub repository, and uses the login-action
to log in to the コンテナレジストリ. It then extracts labels and tags for the Docker image. Finally, it uses the build-push-action
action to build the image and publish it on the コンテナレジストリ.
Docker HubとGitHub Packagesへのイメージの公開
単一のワークフローで、各レジストリの login-action
アクションと build-push-action
アクションを使用して、Docker イメージを複数のレジストリに公開できます。
次のワークフロー例では、前のセクションのステップ(「Docker Hub へのイメージの公開」と「GitHub Packages へのイメージの公開」)を使用して、両方のレジストリにプッシュする単一のワークフローを作成します。
# このワークフローはGitHubによって認定されていないアクションを使用します。
# それらはサードパーティによって提供され、
# 別個の利用規約、プライバシーポリシー、
# サポートドキュメンテーションが適用されます。
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@f054a8b539a109f9f41c372932f1ae047eff08c9
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Log in to the Container registry
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
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@ad44023a93711e3deb337508980b4b5e9bcdc5dc
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
The above workflow checks out the GitHub Enterprise Cloud repository, uses the login-action
twice to log in to both registries and generates tags and labels with the metadata-action
action. Then the build-push-action
action builds and pushes the Docker image to Docker Hub and the コンテナレジストリ.