LoginSignup
0
0

【Docker】GitHubActionsでghcr.ioにマルチプラットフォームビルド

Last updated at Posted at 2024-01-20

はじめに

 サービスを開発し、実際に利用するにはサーバにデプロイする必要がある。近年、チーム開発を行うにあたり開発環境を統一するため、Dockerの採用が増加している。そして、それに伴いDockerコンテナを直接デプロイすることがある。
 Dockerコンテナをデプロイするにあたり、Docker imageをDockerHub、AWS ECRなどに公開する必要があるが、今回はghcr.ioにGitHubActionsを用いてデプロイする方法をまとめる。また、M1チップ搭載のMACを考慮し、AMD64とARM64に対応したimageのデプロイを行う。

Dockerfile

 ghcr.ioにimageを公開するにあたり利用するimageのDockerfileサンプルを以下に示す。

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サンプルを以下に示す。

.github/workflows/deploy.yml
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

 branchpaths.envファイルに記載する内容などの項目は各々の環境に合わせて書き換える必要がある。
 本題であるマルチプラットフォームビルドだが、実装は単純である。まず、Stepsの上から2つ目、Set up QEMUの項目でQEMUのセットアップを行う。QEMUとはオープンソースのプロセッサエミュレータである。そして、Build and pushの項目、platformsで利用するプラットフォームを指定する。今回はlinux/amd64linux/arm64を指定している。これにより、AMD64のimage作成はAMD64の仮想マシン上で、ARM64のimage作成はARM64の仮想マシン上でbuildを行うことで対応している。実際に作成されたimageをGitHubで確認すると、OS/Archでlinux/amd64linux/arm64の2つ作成されていることが確認できる。

まとめ

 本記事ではGitHubActionsを用いてghcr.ioにマルチプラットフォームビルドを行う方法を、サンプルコードを記載しまとめた。詳しいDockerfileの記載方法や、GitHubActionsのworkflow記載方法は公式サイトを確認してほしい。
 では、良いエンジニアライフを。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0