それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

github にpush してghcr.io に docker push する。

github にpush したらghcr.io にdocker push する。

概要

github に push したタイミングで、github actionsを起動して、docker ビルドをして、docker イメージを github コンテナ・レジストリにpush したい

手順

  1. github のレポジトリを用意する
  2. github で actionsから workflow 用の変数を用意する
  3. workflow の定義を用意する
  4. git push する
  5. 動作チェックする。
  6. docker push のチェック
  7. 公開・非公開の切替え
  8. 注意点

github のレポジトリを用意する

github のレポジトリを用意する。

Dockerfile が含まれていたら良い。

workflow 用の変数を用意する

workflow から github のコンテナレジストリにpushするために、ログイン(アクセス権)が必要。パスワードを書くわけにも行かないので、GitHubアクセストークンを用意して、レポジトリの変数に設定する。

レポジトリ→settings→secrets

f:id:takuya_1st:20210927133908p:plain

変数名と中身を設定

f:id:takuya_1st:20210927133955p:plain

設定例

f:id:takuya_1st:20210927134011p:plain

workflow を設定する。

ファイルにワークフローを記述する

REPO/.github/workflows/actions.yml

レポジトリに .github/workflowsディレクトリを作ってyamlをその中に設置する。日本人は workflowsworkflowと書いてしまい複数形を忘れがちなので注意。

docker push 用のキーを書き込み

f:id:takuya_1st:20210927134032p:plain

Dockerfileの場所を指定。

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

f:id:takuya_1st:20210927134049p:plain

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 builddocker 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を選ぶと実行結果が見られる。

f:id:takuya_1st:20210927134130p:plain

docker push のチェック

docker build が無事に終わり、docker pushも無事に終わると、githubにパッケージがpushされている。

github で docker push された結果は、「パッケージ」と呼ばれる。

結果は, https://github.com/YOUR_NAME?tab=packages で見ることができる。

公開・非公開の切り替え

docker push されたイメージは、「プライベート」になっているので、「パブリック」にしてあげる。

公開非公開の切り替えは「パッケージ」の「設定」を使って設定する。

注意点(上限)

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 logon ghcr.io

任意のイメージを 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

参考資料

https://qiita.com/kawakawaryuryu/items/b0291c1bc1141a535263 https://qiita.com/HeRo/items/71f4b73e4d067857a036