公式ではstarter-workflowsとしてDocker imageをbuildをしてGithub Container RegistryにpushするまでのWorkflowが用意されていますが、アクションを使っておらず泥臭くやっているので本記事でアクションを使ったWorkflow構成を記載します。
前提
今回取り扱うリポジトリのファイル構成はルート直下にDockerfileが存在するものとします。
--
|-- Dockerfile
|-- README.md
|-- .github
|-- workflows
|-- actions.yml
...
解
name: Build and Publish Docker
on:
push:
branches:
- master
jobs:
build_and_push:
runs-on: ubuntu-latest
env:
IMAGE_NAME: sample-app
steps:
- name: checkout
uses: actions/checkout@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to GitHub Container Registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.CR_PAT }}
- name: Build and push
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: |
ghcr.io/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}:latest
ghcr.io/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}:1.0.0
ワークフロー解説
本ワークフローではbuild_and_push
というジョブを定義しています。
以降はそのジョブ内の各ステップが何をしているか軽く解説します。
checkout
ソースコードをcheckoutします。
actions/checkout@v2
アクションを利用しています。
Set up Docker Buildx
docker/build-push-action@v2
アクションでdocker build
のための必要なセットアップをここで行っています。
docker/setup-buildx-action@v1
アクションを利用しています。
Login to GitHub Container Registry
GitHub Container Registryにdocker imageをpushするためにここでdocker login
を行います。
docker/login-action@v1
アクションを利用します。
with
で必要なパラメータを定義します。
パラメータ | 値 |
---|---|
registry | Dockerレジストリを指定する 今回はGithub Container Registryにpushするので ghcr.io を指定未指定の場合はDocker Hubになる |
username | Dockerレジストリにpushするユーザを指定する 今回はリポジトリオーナー名を環境変数から指定※1 |
password | DockerレジストリにpushするパスワードもしくはPersonal Access Tokenを指定する 今回はsecretsにCF_PATという名前で格納したPersonal Access Tokenを指定※2 |
※1: Github Actionsではデフォルトでいくつかの環境変数が用意されており、今回はその中から取得しました。
参考:Environment variables - GitHub Docs
※2: シークレットの設定方法はこちらを参照。
Encrypted secrets - GitHub Docs
Build and push
docker build
とdocker push
を行います。
docker/build-push-action@v2
アクションを利用しています。
with
で必要なパラメータを定義します。
パラメータ | 値 |
---|---|
context |
docker build する際のパスもしくはURLを指定actions/checkout アクションを使った場合にパスの指定が可能今回はcheckoutしたルート配下を指定 未指定の場合はGit contextとなる |
push | Dockerレジストリにpushする場合はtrueを指定 |
tags | buildするimageにつけるタグを指定 タグは複数指定可能 今回はlatestと1.0.0のタグを付与 |
file | 参照するDockerfileパスを指定 未指定の場合は ./Dockerfile となる今回はこのパラメータは使用していないがルート直下以外のDockerfileを参照する場合は使用する |