Gatsby開発環境をWindows + Dockerで作成する場合の注意点
GatsbyをDockerコンテナで動かし、ソースコードはホストOSのディレクトリに置きマウントする、というのはよくやると思いますがいくつか注意点があります。
それら注意点について個別記事は見つかりますが、全体がまとまったものが意外とないんですよね。
まさかハマったのは自分だけ?? そんなはずはないでしょうってことで共有します。
環境
まず私の環境を紹介します。Dockerfile
とdocker-compose.yaml
の中にポイントがいくつかありますが詳細は後述します。
OS
>systeminfo
~~ cut ~~~
OS 名: Microsoft Windows 11 Home
OS バージョン: 10.0.22621 N/A ビルド 22621
npm version
$ npm --version
9.5.0
Gatsby version
$ gatsby --version
Gatsby CLI version: 5.9.0
Gatsby version: 5.9.0
Note: this is the Gatsby version for the site at: /usr/src/gutenberg-rankings0
Dockerfile
FROM node:18.15.0-alpine3.17
RUN apk update && \
apk upgrade --available && \
apk add bash vim curl npm git && \
apk add --update python3
RUN npm install -g gatsby-cli
WORKDIR /usr/src
docker-compose.yaml
version: '3.9'
services:
node:
build:
context: .
dockerfile: Dockerfile
image: gatsby
container_name: gatsby
hostname: gatsby
volumes:
- ./gatsby_src:/usr/src/ # ローカルディレクトリをコンテナにマウント
ports:
- "3000:3000" #react
- "8000:8000" #gatsby develop.
- "9000:9000" #gatsby serve
stdin_open: true
environment:
- WATCHPACK_POLLING=true # react and gatsby hot reloading
user: 1000:1000
注意点
1: gatsby developが遅いのでWSL2を使う
Windowsのディレクトリにソースを置いて、gatsby develop
すると10分くらいかかりました。これではやってられません。原因や対策は以下がよくまとまっています。
私がどうしたかというとWSL2でUbuntu-22.04
を立ち上げ、ソースを以下のディレクトリに置きました。
\\wsl.localhost\Ubuntu-22.04\home\ユーザ名\gatsby_src\
前述のdocker-compose.yamlを見てもらうと分かりますが、上記パスのgatsby_src
をマウントしています。
結果としてgatsby develop の時間は約30秒になりました。20倍の速度改善 です。
2: コンテナでユーザを指定する
docker-compose.yamlのuser: 1000:1000
部分の話です。
ソースを置くディレクトリ\\wsl.localhost\Ubuntu-22.04\home\ユーザ名
は、Windows
、WLSのUbuntu
、コンテナ
から操作ができます。で、普通にコンテナを作ると、コンテナ上のユーザはroot権限を持つので、コンテナのrootが作ったファイルをUbuntuの一般ユーザーから編集できない なんてめんどくさいことが発生します。
そこでWSLのUbuntuとコンテナ上のユーザを合わせます。
方法としては、Ubuntuでidコマンドを実行し、そこで確認できたuidとgidをdocker-compose.yamlに設定します。
kt@kt-p:~/gutenberg_rankings$ id
uid=1000(kt) gid=1000(kt) groups=1000(kt),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),116(netdev),1001(docker)
user: 1000:1000
3: ホットリローディング
ホットリローディングとは、ソースを編集すると即座にビルドしなおして反映してくれる機能です。開発には必須機能ですが、Docker環境だと環境変数を設定しないと動作しません。
ホットリローディングを有効にするために、docker-compose.yamlに以下の環境変数を追加します。
environment:
- WATCHPACK_POLLING=true # react and gatsby hot reloading
なお、以下の環境変数で有効化できるという情報もありましたが私の環境ではダメでした。もし上記環境変数でうまくいかない場合は追加してみてもいいでしょう。
CHOKIDAR_USEPOLLING=true
NODE_ENV=development
GATSBY_WEBPACK_PUBLICPATH=/
4: gatsby develop -H 0.0.0.0
gatsby developを行うとWebサーバが立ち上がりport 8000で待ち受けます。しかし、単にgatsby develop
を行った場合、localhostからのアクセスしか受け付けません。つまり、Gatsbyがコンテナで動いている場合、コンテナ内部からしかアクセスできないわけです。
Windows上のブラウザからコンテナのport 8000にアクセスするには、-H 0.0.0.0
を追加しましょう。
gatsby develop -H 0.0.0.0
これでサクサク開発ができます。
Discussion