Strapi(v4) + MySQLをdocker-compose化する

Strapiはv3まで公式Dockerイメージが提供されていて、それを使えばある程度簡単にdocker-compose化できると思うのですが、最新のv4では公式Dockerイメージが提供されていません。
とはいえ、Dockerを使ってMySQLのコンテナと一緒に管理できると何かと便利なのでStrapiもDockerコンテナ化しようと思ったのですが、いくつかハマりポイントがあったのでその解説をしつつ、備忘録的にStrapi(v4)とMySQLをdocker-composeで一元管理する方法を綴っていきます。

Strapi(v4)の有志によるDockerイメージは既に存在するが…

naskio/docker-strapiというStrapi(v4)用のDockerイメージが存在するのですが、ビルドの段階でCannot find module 'react'というエラーが表示される問題に悩まされていました。 (Issue)

そこで、この問題を解決したV-Shadbolt/docker-strapiというDockerイメージが派生して出来たようなのですが、こちらを使ってみてもエラー(内容は忘れた)が出てDockerコンテナが立ち上がりませんでした。

ということで、セルフでStrapiをDocker化してみようと思い立ったわけです。

新規Strapiプロジェクトを作成する

まずはnpx create-strapi-app@latest strapiで新規にStrapiのプロジェクトを作成します。プロジェクト名はstrapiとしておきます。

Quickstartは使わずにCustomを選択、データーベースにMySQLを選択しセットアップを進めます。ちなみに途中でMySQLの接続情報の入力を求められますが、Dockerで上書きするので適当な値を入力しておけば大丈夫です。

.envファイルを引っ張ってきて編集する

$ mv strapi/.env ./

上記の手順により自動作成されたstrapiディレクトリーにある.envファイルを1つ上の階層に移動させます。(この後docker-compose.ymlが来るのと同じ階層)

HOST=0.0.0.0
PORT=1337
APP_KEYS=ランダムな文字列
API_TOKEN_SALT=ランダムな文字列
ADMIN_JWT_SECRET=ランダムな文字列
TRANSFER_TOKEN_SALT=ランダムな文字列
# Database
DATABASE_CLIENT=mysql
DATABASE_HOST=mysql
DATABASE_PORT=3306
DATABASE_NAME=strapi
DATABASE_USERNAME=username
DATABASE_PASSWORD=password
DATABASE_SSL=false

おそらく今.envファイルはこのようなランダムな文字列と先程のCLIで入力したMySQLの接続情報が入力されている状態になっていると思いますが、このうちDATABASE_HOSTmysqlに変更します。

これは何かというとMySQLのDockerコンテナの名前になります。(今回はdocker-compose.yml内でMySQLのコンテナ名をmysqlと定義するため)

あとはお好みでDB名やユーザー名、パスワードなどを変更してください🔐

必要なファイルを作成する

移動後の.envファイルと同じ階層にDockerfiledocker-compose.yml.dockerignoreを置きます。
中身は以下のものをコピーしてください。

Dockerfile

FROM node:20-alpine
RUN apk update && apk add --no-cache build-base gcc autoconf automake zlib-dev libpng-dev nasm bash vips-dev git
ARG NODE_ENV=development
ENV NODE_ENV=${NODE_ENV}
WORKDIR /opt/
COPY ./strapi/ .
RUN rm -rf ./node_modules
ENV PATH /opt/node_modules/.bin:$PATH
RUN npm config set fetch-retry-maxtimeout 600000 -g && npm install
WORKDIR /opt/app
RUN npm run build
EXPOSE 1337
CMD ["npm", "run", "develop"]

ちなみに7行目が結構ミソで、VPSのUbuntuでDockerを使わずにStrapiプロジェクトを新規作成しようとした時にぶち当たった問題から得たナレッジを反映しています。

手元のMacだと普通に新規作成できるのですが、Dockerイメージをビルドする時node_modulesを削除しないとやっぱりエラーで立ち上がらなかったのでどうやらLinuxだとこの処置をする必要がありそう…?

docker-compose.yml

services:
  mysql:
    container_name: mysql
    platform: linux/amd64
    restart: unless-stopped
    env_file: .env
    image: mysql:8.0-debian
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_USER: ${DATABASE_USERNAME}
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_PASSWORD: ${DATABASE_PASSWORD}
      MYSQL_DATABASE: ${DATABASE_NAME}
    volumes:
      - ./mysql_data:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - strapi_network

  strapi:
    depends_on:
      - mysql
    container_name: strapi
    build:
      context: .
      dockerfile: Dockerfile
    restart: unless-stopped
    env_file: .env
    ports:
      - "1337:1337"
    networks:
      - strapi_network

networks:
  strapi_network:
    name: strapi_network
    driver: bridge

.dockerignore

.tmp/
.cache/
.git/
.env
build/
node_modules/
data/
backup/

これは公式の丸コピです。

docker-composeでコンテナを立ち上げる

準備はできたのでコンテナを立ち上げてみましょう!

$ docker-compose up

問題なく起動するかログを確認したいのであえて-dオプションを抜いてコンテナを立ち上げてみます。

よさそう

http://localhost:1337/adminにアクセスしてアカウント登録画面が表示されれば成功です!

今現在このブログをリニューアルするための開発をしているのですが、この「StrapiをDockerを用いて運用する」というところで結構ハマったので忘れないうちにと思って急いで記事に起こしましたw

おそらく年内にはリニューアル完了していると思うのでお楽しみに!

コメント

タイトルとURLをコピーしました