Docker を使って 0 からReact(TypeScript)の開発環境を構築する
まえおき
やりたいことはタイトル通り。まっさらな状態からやっていく。調べてみると意外とまとめてある記事がなかったので、書き留めておく。
正直微妙だなと思う点もあるけど、誰かの参考になれば幸いです。
環境
Docker: 3.3.3
前提条件
- Docker のインストール & セットアップ済み
- プロジェクト・ディレクトリの作成
手順
-
Dockerfile作成 -
docker-compose.yml作成 docker-compose run --rm app sh -c 'npx create-react-app 任意のプロジェクト名 --template typescript && cp -RT 任意のプロジェクト名/. ./ && rm -rf 任意のプロジェクト名'-
Dockerfile,docker-compose.yml修正 - port の変更 (任意)
docker-compose builddocker-compose up
1. Dockerfile 作成
事前に用意したディレクトリに Dockerfileを作成。内容は以下の通り。
FROM node:16.3
ENV LANG=C.UTF-8
ENV APP=/app
RUN mkdir -p ${APP}
WORKDIR ${APP}
COPY . ${APP}
Tips
- node の docker イメージはここから必要なバージョンを指定
2. docker-compose.yml 作成
続いてdocker-compose.ymlを作成する。内容は以下の通り
version: '3'
services:
app:
build: .
command: [yarn, start]
ports:
- '8080:8080'
volumes:
- .:/app:cached
Tips
-
servicesはとりあえずappにしたけど、これは一般的なのか自信ない。Railsだとwebにすることが多い気がするけど、React だとどうなんだろう。えらい人教えてください。
3. docker-compose run --rm app sh -c 'npx create-react-app 任意のプロジェクト名 --template typescript && cp -RT 任意のプロジェクト名/. ./ && rm -rf 任意のプロジェクト名'
コマンド例: docker-compose run --rm app sh -c 'npx create-react-app my-app --template typescript && cp -RT my-app/. ./ && rm -rf my-app'
Tips
-
公式ドキュメント通り、TypeScriptを使いたい場合は、
create-react-appのオプションに--template typescriptをつける -
npmじゃないのって思うけど、npxであってる。同じように思う人も多いのか、公式にも補足として書いてある。 - 後から付け足したい場合は
yarn add --dev typescriptかnpm install --save-dev typescriptで出来るらしい。 -
create-react-app .が出来ればこんなコマンド打つ必要ないんだけど、出来なかったので苦肉の策。 - cpコマンドを使うときに
*を使うと隠しフォルダがコピーされないため、代わりに.を使う。
4. Dockerfile, docker-compose.yml 修正
node_modules は volume で管理したいので、以下のように Dockerfile, docker-compose.yml を以下のように更新する
--- 省略 ---
WORKDIR ${APP}
# 以下 2行を追加
COPY package.json yarn.lock ${APP}/
RUN set -x && \
apt-get update && \
apt-get install -y nodejs yarn && \
yarn install && \
yarn cache clean && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
COPY . ${APP}
--- 省略 ---
volumes:
- .:/app:cached
- /app/node_modules # この一行を追加
Tips
-
/app/node_modulesを追加しないと、コンテナ内のnode_modulesが空になるため起動しない。(参考記事) - 初期段階では
package.json,yarn.lockがないためここで追加する -
docker-compose.ymlの追加部分は初期段階であってもいい。わかりやすくするために、あえてここで追加しているだけ。
5. portの変更(任意)
create-react-appでプロジェクトを作成した場合、デフォルトで3000番ポートが使用される。しかし自分の場合、バックエンドにRailsを使用しており、そちらですでに3000番ポート使用していため、ポート番号を変更する必要があった。この記事で書かれてるdocker-compose.yml を使うなら必要。
変更はpackage.json内のscriptを以下のようにすればいい。
--- 省略 ---
"scripts": {
"start": "PORT=8080 react-scripts start", # PORT=任意のポート番号 を追記
--- 省略 ---
Tips
-
docker-compose.yml設定しているports:配下の番号と、ここで設定するポート番号が一致しないと、http://localhost:ポート番号/ をブラウザで開いてもつながらない。
6. docker-compose build
7. docker-compose up
docker-compose up で起動。今回の場合だと http://localhost:8080/ (ポートの設定をしてなければ、http://localhost:3000)につなげばおなじみ(?) の React のデフォルト画面(?) が開かれる。
Tips
- もし
Error: Cannot find module '../scripts/start'のようなエラーが出たら、node_module フォルダを一回消して、その後docker-compose run --rm yarn install。その後もう一度docker-compose up
まとめ
微妙だなと思うところはいくつかあるけど、とりあえず上記の方法で必要な環境は出来上がるはず。
今回のような記事が全然ないのだけど、需要がないのだろうか。。。?
参考資料
Discussion