ノート: GitHubホストランナーは、現在GitHub Enterprise Serverでサポートされていません。 GitHubパブリックロードマップで、計画されている将来のサポートに関する詳しい情報を見ることができます。
はじめに
このガイドでは、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を参照してください。
ノート: GitHub Enterprise Serverのインスタンス上のGitHub ActionsのGitHub.comあるいはGitHub Marketplace上のアクションへのアクセスには制限があるかもしれません。 詳しい情報については「GitHub.comからのアクションへのアクセスの管理」を参照し、GitHub Enterpriseのサイト管理者に連絡してください。
Docker Hubへのイメージの公開
GitHub上で新しいリリースを作成するたびに、イメージを公開するワークフローを起動できます。 以下の例のワークフローは、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 のユーザ名とパスワードをシークレットとして保存することをお勧めします。 詳しい情報については、「暗号化されたシークレットの作成と利用」を参照してください。
Docker Hubに必要なbuild-push-actionのオプションは以下のとおりです。
tags:DOCKER-HUB-NAMESPACE/DOCKER-HUB-REPOSITORY:VERSIONの形式の新しい画像のタグ。 以下のとおり、単一のタグを設定することも、リストに複数のタグを指定することもできます。push:trueに設定すると、イメージは正常にビルドされた場合にレジストリにプッシュされます。
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@v2
- name: Log in to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Push to Docker Hub
uses: docker/build-push-action@v2
with:
push: true
tags: my-docker-hub-namespace/my-docker-hub-repository:latestGitHub Packagesへのイメージの公開
GitHub上で新しいリリースを作成するたびに、イメージを公開するワークフローを起動できます。 以下の例のワークフローは、createdというアクティビティの種類を持つreleaseイベントが生じた時に実行されます。 releaseイベントに関する詳しい情報については「ワークフローを起動するイベント」を参照してください。
以下のワークフロー例では、Docker の login-action アクションと build-push-action アクションを使用して Docker イメージをビルドし、ビルドが成功すればそのイメージを GitHub Packages にプッシュします。
GitHub Packages に必要な login-action オプションは次のとおりです。
registry:docker.pkg.github.comに設定しなければなりません。username:${{ github.actor }}コンテキストを使って、ワークフローの実行を始めたユーザのユーザ名を自動的に使うことができます。 詳しい情報については、「GitHub Actionsのコンテキストと式構文」を参照してください。password: パスワードには、自動的に生成されたGITHUB_TOKENシークレットを利用できます。 詳しい情報については「GITHUB_TOKENでの認証」を参照してください。
GitHub Packagesに必要なbuild-push-actionのオプションは以下のとおりです。
tags:docker.pkg.github.com/OWNER/REPOSITORY/IMAGE_NAME:VERSIONの形式で設定する必要があります。 たとえば、GitHub のhttp://github.com/octo-org/octo-repoに保存されているocto-imageという名前の画像の場合、tagsオプションをdocker.pkg.github.com/octo-org/octo-repo/octo-image:latestに設定する必要があります。 以下のとおり、単一のタグを設定することも、リストに複数のタグを指定することもできます。push:trueに設定すると、イメージは正常にビルドされた場合にレジストリにプッシュされます。
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registry:
name: Push Docker image to GitHub Packages
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v2
- name: Log in to GitHub Docker Registry
uses: docker/login-action@v1
with:
registry: docker.pkg.github.com
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build container image
uses: docker/build-push-action@v2
with:
push: true
tags: |
docker.pkg.github.com/${{ github.repository }}/octo-image:${{ github.sha }}
docker.pkg.github.com/${{ github.repository }}/octo-image:${{ github.ref }}Docker HubとGitHub Packagesへのイメージの公開
単一のワークフローで、各レジストリの login-action アクションと build-push-action アクションを使用して、Docker イメージを複数のレジストリに公開できます。
次のワークフロー例では、前のセクションのステップ(「Docker Hub へのイメージの公開」と「GitHub Packages へのイメージの公開」)を使用して、両方のレジストリにプッシュする単一のワークフローを作成します。
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registries:
name: Push Docker image to multiple registries
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v2
- name: Log in to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Log in to GitHub Docker Registry
uses: docker/login-action@v1
with:
registry: docker.pkg.github.com
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Push to Docker Hub
uses: docker/build-push-action@v2
with:
push: true
tags: my-docker-hub-namespace/my-docker-hub-repository:${{ github.ref }}
- name: Build container image
uses: docker/build-push-action@v2
with:
push: true
tags: docker.pkg.github.com/${{ github.repository }}/my-image:${{ github.ref }}上記のワークフローは、GitHub リポジトリをチェックアウトし、login-action を 2 回使用して両方のレジストリにログインし、build-push-action アクションを 2 回使用して、Docker イメージをビルドして Docker Hub と GitHub Packages にプッシュします。 どちらのステップでも、ビルドされた Docker イメージにワークフローイベントの Git リファレンスをタグ付けします。 このワークフローはGitHubリリースの公開で起動されるので、どちらのレジストリの参照も、そのリリースのGitタグになります。

