はじめに
サービスを開発し、実際に利用するにはサーバにデプロイする必要がある。近年、チーム開発を行うにあたり開発環境を統一するため、Dockerの採用が増加している。そして、それに伴いDockerコンテナを直接デプロイすることがある。
Dockerコンテナをデプロイするにあたり、Docker imageをDockerHub、AWS ECRなどに公開する必要があるが、今回はghcr.ioにGitHubActionsを用いてデプロイする方法をまとめる。また、M1チップ搭載のMACを考慮し、AMD64とARM64に対応したimageのデプロイを行う。
Dockerfile
ghcr.ioにimageを公開するにあたり利用するimageのDockerfile
サンプルを以下に示す。
FROM node:18 as modules
COPY ./package*.json /opt/frontend/
WORKDIR /opt/frontend
RUN npm install
FROM node:18 as build
COPY . /opt/frontend
COPY --from-modules /opt/frontend/node_modules /opt/frontend/node_modules
WORKDIR /opt/frontend
RUN npm run build
FROM node:18-alpine
COPY ./package*.json /opt/frontend/
COPY --from=build /opt/frotend/node_modules /opt/frontend/node_modules
COPY --from=build /opt/frontend/.next /opt/frontend/.next
WORKDIR /opt/frontend
CMD ["npm", "run", "start"]
上記したDockerfileはマルチステージビルドを行っている。詳しくは解説しないが、マルチステージビルドにより最終的な実行を行うimageに必要最低限のファイルしか持たせないことで、リソースを削減するなどのメリットがある。
GitHubActions
次に、本記事の目的であるマルチプラットフォームビルドを行うGitHubActionsのworkflow
サンプルを以下に示す。
name: Deploy frontend to ghcr.io
on:
push:
branches:
- main
paths:
- ./frontend/**
- .github/workflows/deploy.yml
jobs:
deploy:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./frontend
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to GitHub Container Registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.ACCESS_TOKEN }}
- name: generate .env
run: |
touch .env
echo "NEXT_PUBLIC_API_URL=${{ secrets.NEXT_PUBLIC_API_URL }}" >> .env
- name: Build and push
uses: docker/build-push-action@v2
with:
context: ./frontend
push: true
tags: |
ghcr.io/${{ github.repository_owner }}/frontend:latest
ghcr.io/${{ github.repository_owner }}/frontend:1.0.0
platforms: linux/amd64,linux/arm64
branch
やpaths
、.env
ファイルに記載する内容などの項目は各々の環境に合わせて書き換える必要がある。
本題であるマルチプラットフォームビルドだが、実装は単純である。まず、Stepsの上から2つ目、Set up QEMU
の項目でQEMUのセットアップを行う。QEMUとはオープンソースのプロセッサエミュレータである。そして、Build and push
の項目、platforms
で利用するプラットフォームを指定する。今回はlinux/amd64
とlinux/arm64
を指定している。これにより、AMD64のimage作成はAMD64の仮想マシン上で、ARM64のimage作成はARM64の仮想マシン上でbuildを行うことで対応している。実際に作成されたimageをGitHubで確認すると、OS/Archでlinux/amd64
とlinux/arm64
の2つ作成されていることが確認できる。
まとめ
本記事ではGitHubActionsを用いてghcr.ioにマルチプラットフォームビルドを行う方法を、サンプルコードを記載しまとめた。詳しいDockerfileの記載方法や、GitHubActionsのworkflow記載方法は公式サイトを確認してほしい。
では、良いエンジニアライフを。