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
画面デザインの変更に合わせて画像を若干更新