注: GitHub ホステッド ランナーは、現在 GitHub Enterprise Server でサポートされていません。 GitHub public roadmap で、今後の計画的なサポートの詳細を確認できます。
はじめに
このガイドでは、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 Enterprise Server 上で新しいリリースを作成するたびに、イメージを公開するワークフローを起動できます。 次の例のワークフローは、release
イベントが created
アクティビティの種類でトリガーされたときに実行されます。 release
イベントの詳細については、「ワークフローをトリガーするイベント」を参照してください。
以下のワークフロー例では、Docker login-action
および build-push-action
アクションを使用して Docker イメージをビルドし、ビルドが成功した場合は、ビルドされたイメージを Docker Hub にプッシュします。
Docker Hubにプッシュするためには、Docker Hubのアカウントを持っており、Docker Hubのレジストリを作成していなければなりません。 詳細については、Docker ドキュメントの「Docker コンテナー イメージを Docker Hub にプッシュする」を参照してください。
Docker Hub に必要な login-action
オプションは次のとおりです。
username
とpassword
: これは Docker Hub のユーザー名とパスワードです。 ワークフローファイルに公開されないように、Docker Hub のユーザ名とパスワードをシークレットとして保存することをお勧めします。 詳しくは、「暗号化されたシークレット」を参照してください。
Docker Hub に必要な metadata-action
オプションは次のとおりです。
images
: ビルドして Docker Hub にプッシュする Docker イメージの名前空間と名前。
Docker Hub に必要な build-push-action
オプションは次のとおりです。
tags
:DOCKER-HUB-NAMESPACE/DOCKER-HUB-REPOSITORY:VERSION
形式の新しいイメージのタグ。 以下のとおり、単一のタグを設定することも、リストに複数のタグを指定することもできます。push
:true
に設定した場合は、イメージが正常にビルドされると、レジストリにプッシュされます。
# このワークフローはGitHubによって認定されていないアクションを使用します。
# それらはサードパーティによって提供され、
# 別個の利用規約、プライバシーポリシー、
# ドキュメントを参照してください。
# GitHub では、コミット SHA にアクションをピン留めすることが推奨されます。
# 新しいバージョンを取得するには、SHA を更新する必要があります。
# タグまたはブランチを参照することもできますが、アクションは警告なしに変更される可能性があります。
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registry:
name: Push Docker image to Docker Hub
runs-on: [self-hosted]
steps:
- name: Check out the repo
uses: actions/checkout@v2
- name: Log in to Docker Hub
uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
images: my-docker-hub-namespace/my-docker-hub-repository
- name: Build and push Docker image
uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
上記のワークフローでは、GitHub リポジトリをチェックアウトし、login-action
を使用してレジストリにログインしてから、build-push-action
アクションを使用して、リポジトリの Dockerfile
に基づいて Docker イメージをビルドし、イメージを Docker Hub にプッシュし、タグをイメージに適用します。
GitHub Packagesへのイメージの公開
GitHub Enterprise Server 上で新しいリリースを作成するたびに、イメージを公開するワークフローを起動できます。 次の例のワークフローは、release
イベントが created
アクティビティの種類でトリガーされたときに実行されます。 release
イベントの詳細については、「ワークフローをトリガーするイベント」を参照してください。
以下のワークフロー例では、Docker login-action
および build-push-action
アクションを使用して Docker イメージをビルドし、ビルドが成功した場合は、ビルド イメージを GitHub Packages にプッシュします。
GitHub Packages に必要な login-action
オプションは次のとおりです。
registry
:docker.pkg.github.com
に設定する必要があります。username
:${{ github.actor }}
コンテキストを使用すると、ワークフロー実行をトリガーしたユーザーのユーザー名を自動的に使用できます。 詳しくは、「コンテキスト」を参照してください。password
: 自動的に生成されたGITHUB_TOKEN
シークレットをパスワードに使用できます。 詳しくは、「自動トークン認証」を参照してください。
GitHub Packages に必要な build-push-action
オプションは次のとおりです。
-
push
:true
に設定した場合は、イメージが正常にビルドされると、レジストリにプッシュされます。 -
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
に設定する必要があります。 以下のとおり、単一のタグを設定することも、リストに複数のタグを指定することもできます。
# このワークフローはGitHubによって認定されていないアクションを使用します。
# それらはサードパーティによって提供され、
# 別個の利用規約、プライバシーポリシー、
# ドキュメントを参照してください。
# GitHub では、コミット SHA にアクションをピン留めすることが推奨されます。
# 新しいバージョンを取得するには、SHA を更新する必要があります。
# タグまたはブランチを参照することもできますが、アクションは警告なしに変更される可能性があります。
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registry:
name: Push Docker image to GitHub Packages
runs-on: ubuntu-latest
permissions:
packages: write
contents: read
steps:
- name: Check out the repo
uses: actions/checkout@v2
- name: Log in to GitHub Docker Registry
uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
with:
registry: docker.pkg.github.com
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
with:
context: .
push: true
tags: |
docker.pkg.github.com/${{ github.repository }}/octo-image:${{ github.sha }}
docker.pkg.github.com/${{ github.repository }}/octo-image:${{ github.event.release.tag_name }}
上記のワークフローでは、GitHub Enterprise Server リポジトリをチェックアウトし、login-action
を使用してレジストリにログインしてから、build-push-action
アクションを使用して、リポジトリの Dockerfile
に基づいて Docker イメージをビルドし、Docker レジストリにイメージをプッシュし、コミット SHA とリリース バージョンをイメージ タグとして適用します。
Docker HubとGitHub Packagesへのイメージの公開
単一のワークフローで、各レジストリに対して login-action
および build-push-action
アクションを使用して、Docker イメージを複数のレジストリに公開できます。
次のワークフロー例では、前のセクション (「Docker Hub へのイメージの公開」と「GitHub Packages へのイメージの公開」) の手順を使用して、両方のレジストリにプッシュする単一のワークフローを作成します。
# このワークフローはGitHubによって認定されていないアクションを使用します。
# それらはサードパーティによって提供され、
# 別個の利用規約、プライバシーポリシー、
# ドキュメントを参照してください。
# GitHub では、コミット SHA にアクションをピン留めすることが推奨されます。
# 新しいバージョンを取得するには、SHA を更新する必要があります。
# タグまたはブランチを参照することもできますが、アクションは警告なしに変更される可能性があります。
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registries:
name: Push Docker image to multiple registries
runs-on: [self-hosted]
permissions:
packages: write
contents: read
steps:
- name: Check out the repo
uses: actions/checkout@v2
- name: Log in to Docker Hub
uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Log in to the Docker registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
with:
registry: docker.pkg.github.com
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
images: |
my-docker-hub-namespace/my-docker-hub-repository
docker.pkg.github.com/${{ github.repository }}/my-image
- name: Build and push Docker images
uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
上記のワークフローでは、GitHub Enterprise Server リポジトリをチェックアウトし、login-action
を 2 回使用して両方のレジストリにログインし、metadata-action
アクションでタグとラベルを生成します。
その後、build-push-action
アクションによって Docker イメージがビルドされ、Docker Hub および Docker レジストリにプッシュされます。