Dockerfile を GitHub に push したら GitHub actions が走ってコンテナイメージをビルドして GitHub Container Registry (GHCR) に push するやつ
たまにやるときに忘れるのでメモ
実例
やること
GitHub で新しいレポジトリを作る
actionsのフックが面倒になるので1コンテナ1レポジトリが望ましいと思う
レポジトリが増えるのはしょうがない
先にPATを作る
PAT: personal access token
今回は github repository に GHCR に対して push する権限を渡すために使うトークン
User account > Settings > Developers settings > Personal access tokens
Generate new tokens する
package:write の権限にチェックを入れて作成
生成された token の文字列をコピーしておく
新しく作ったレポジトリに PAT を登録する
New repository secret をクリックして登録
名前は CR_PAT とするが別になんでもいいが後で作成する github actions の中にこの名前を書く必要がある
レポジトリに Dockerfile と actions のファイルを作成する
パスはそれぞれ
./docker/Dockerfile
今回は detex を例に
わざわざ docker の dir を掘っているのは docker build 時に余計なファイルを送らないため
ビルド時間が微妙に短縮できる
COPY . /app とかやるタイプの Dockerfile の場合は .dockerignore を適宜使いましょう
./.github/workflows/actions.yml
yml のファイル名は別になんでもいい
GitHub commit hash を使ってコンテナのタグをユニークにしている
code:docker/Dockerfile
FROM ubuntu:18.04
ENV OPENDETEX_VERSION=2.8.1
RUN apt update -y && apt install -y make gcc flex wget
tar xjvf opendetex-${OPENDETEX_VERSION}.tar.bz2 && \
cd opendetex && \
make && make install
code:.github/workflows/actions.yml
name: Build Docker Image and Publish to GHCR
on:
push:
branches:
- main
jobs:
build_and_push:
runs-on: ubuntu-latest
env:
IMAGE_NAME: detex
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: Set env
run: echo "GIT_HASH=$(git rev-parse --short ${GITHUB_SHA})" >> $GITHUB_ENV
- name: Build and push
uses: docker/build-push-action@v2
with:
context: ./docker
push: true
tags: |
ghcr.io/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}:${{ env.GIT_HASH }}
secrets.CR_PAT とか context: ./docker とかが自分のレポジトリの設定と合っているかチェック
あと IMAGE_NAME: でコンテナイメージの名前を設定しているので適宜変える
あとはそのまんまでOK
こいつらを GitHub repository に push する
main に push すると action が走る
ビルドが成功すると push される
push まで成功すると packages に package のページが生成されている
デフォルトでは private になっており、レポジトリとパッケージがリンクされていない
package settings から Change package visibility で visibility を public に変更する
Link this package to a repository でレポジトリとパッケージをリンクする
おわり。
おまけ
このあたりの仕様がちょこちょこ変わっていて古いブログとかだと違うことを書いていて混乱するので注意。