github にpush したらghcr.io にdocker push する。
概要
github に push したタイミングで、github actionsを起動して、docker ビルドをして、docker イメージを github コンテナ・レジストリにpush したい
手順
- github のレポジトリを用意する
- github で actionsから workflow 用の変数を用意する
- workflow の定義を用意する
- git push する
- 動作チェックする。
- docker push のチェック
- 公開・非公開の切替え
- 注意点
github のレポジトリを用意する
github のレポジトリを用意する。
Dockerfile が含まれていたら良い。
workflow 用の変数を用意する
workflow から github のコンテナレジストリにpushするために、ログイン(アクセス権)が必要。パスワードを書くわけにも行かないので、GitHubアクセストークンを用意して、レポジトリの変数に設定する。
プロジェクト(レポジトリ)→settings→secrets

変数名と中身を設定

設定例
名前: GH_ACCESS_TOKEN 中身:Githubから発行される個人用アクセストークン

アクセストークンの発行は別記事を参照のこと。
workflow を設定する。
ファイルにワークフローを記述する
## git clone git clone https://github.com/takuya/$REPO cd $REPO mkdir -p .github/workflows/ touch .github/workflows/actions.yml ## open $REPO/.github/workflows/actions.yml
レポジトリに .github/workflowsディレクトリを作ってyamlをその中に設置する。日本人は workflowsを workflowと書いてしまい複数形を忘れがちなので注意。
docker push 用のキーを書き込み

Dockerfileの場所を指定。
Dockerfile が格納されているフォルダを指定する。フォルダを作らずDockerfileを直接設置したときは ./とカレントディレクトリを指定しておけばいい。

actions.yml の設定例
name: Build and Publish Docker
on:
push:
branches:
- master
jobs:
build_and_push:
runs-on: ubuntu-latest
env:
IMAGE_NAME: sample-docker-image
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.GH_ACCESS_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v2
with:
context: ./docker-build
push: true
tags: |
ghcr.io/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}:latest
ghcr.io/${{ github.repository_owner }}/${{ env.IMAGE_NAME }}:1.0.0
workflow のかんたんな解説。
ビルドとpushをする箇所
docker build と docker pushを行うのはここ。
- name: Build and push
uses: docker/build-push-action@v2
これは。https://github.com/docker/build-push-action で公開されているスクリプトで、それを取り込んで実行している。
push 先とタグを tags: で指定している。
${{ github.repository_owner }} は githubワークフローのcontextと呼ばれるプリセット変数である。
docker push の準備をする箇所
docker push にはログインが必要なので、ログインを行う。
- name: Login to GitHub Container Registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GH_ACCESS_TOKEN }}
これは、 https://github.com/docker/login-actionで公開されているスクリプトで。uses: docker/login-action@v1 を使って利用を指定して、どこにログインするかとパスワードとユーザー名をyaml で与えている。
${{ secrets.GH_ACCESS_TOKEN }}が最初にレポジトリに設定したsecrets変数である。接頭辞をつけてsecrets.MY_NAME でアクセスする。
git push で動作させる
master レポジトリにpush すると actionが動き出す。
git push origin master
master で動くのは、masterへのpush で起動指定してあるから。
ワークフローのyml の冒頭部分(以下抜粋)で指定してある。
on:
push:
branches:
- master
動作チェックする
レポジトリ→Actionsを選ぶと実行結果が見られる。

docker push のチェック
docker build が無事に終わり、docker pushも無事に終わると、githubにパッケージがpushされている。
github で docker push された結果は、「パッケージ」と呼ばれる。
結果は, https://github.com/YOUR_NAME?tab=packages で見ることができる。
公開・非公開の切り替え
docker push されたイメージは、「プライベート」になっているので、「パブリック」にしてあげる。
公開非公開の切り替えは「パッケージ」の「設定」を使って設定する。

https://github.com/USERNAME のページで確認できる。
注意点(上限)
workflowとghcr を使うときはパブリックにしておかないと容量と実行時間の上限がシビアなので、パブリックが無難だと思う。可能な限りパブリックにするといいと思う。
2021-09-26 現在で調べた限りですが。
github コンテナ・レジストリでは、デフォルトで500MBの「プライベート領域」がある。そして、push したら、デフォルトでプライベートになる。 しかし、「パブリック」なら無制限である。
そのため、push後はパブリックに切り替えて容量を節約している。
docker push で初期非公開になっています。デフォルト設定で公開する方法は見つからなかった。
docker buildがコケたとき
workflow のログを見ながらエラーを修正するとよいが、github の workflow で実行した場合、build用の仮想マシンを毎回新規作成するので、時間がかかる。
そのため、手元のローカルマシンで docker build をしてbuildが確認できてからgit push で起動したほうがいい。
docker push がコケたとき
docker push がコケたら、面倒だけど一回手作業で docker push しておく。
push 自体はとても簡単なので、一度手作業でpush を試してからgit push してももいいと思う。
push を手動でやる方法
TODO::別エントリ
docker で ghcr.io にログインする。
docker logoin ghcr.io
docker login ghcr の注意 :アクセストークンを使ってログインすること。
任意のイメージを github に push できる名前をつける。
たとえば、apline を ghcr.io にpush するなら
docker pull alpine
name=ghcr.io/takuya/my-first-docker-image
source_id=$(docker images alpine:latest --format="{{.ID}}")
docker tag $source_id $name
git push $name
alpine:latest に名前をつけて、その名前でpushする
名前は、次のようになる。
ghcr.io/YOUR_GITHUB_NAME/IMAGE_NAME
docker push できればあとは、github のサイトに従って使えばオッケー
ワークフローがコケる場合は、まずちゃんとghcr.io に docker push できることを確認しておく。
サンプルレポジトリ
docker build して push するサンプルのレポジトリ
動作サンプルようのレポジトリを残しておく。
https://github.com/takuya/github-actions-build-and-push-docker-sample
2022-04-04
画面デザインの変更に合わせて画像を若干更新