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_HOST
をmysql
に変更します。
これは何かというとMySQLのDockerコンテナの名前になります。(今回はdocker-compose.yml内でMySQLのコンテナ名をmysql
と定義するため)
あとはお好みでDB名やユーザー名、パスワードなどを変更してください🔐
必要なファイルを作成する
移動後の.env
ファイルと同じ階層にDockerfile
・docker-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
おそらく年内にはリニューアル完了していると思うのでお楽しみに!
コメント