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 build
docker-compose up
Dockerfile
作成
1. 事前に用意したディレクトリに Dockerfile
を作成。内容は以下の通り。
FROM node:16.3
ENV LANG=C.UTF-8
ENV APP=/app
RUN mkdir -p ${APP}
WORKDIR ${APP}
COPY . ${APP}
Tips
- node の docker イメージはここから必要なバージョンを指定
docker-compose.yml
作成
2. 続いてdocker-compose.yml
を作成する。内容は以下の通り
version: '3'
services:
app:
build: .
command: [yarn, start]
ports:
- '8080:8080'
volumes:
- .:/app:cached
Tips
-
services
はとりあえずapp
にしたけど、これは一般的なのか自信ない。Railsだとweb
にすることが多い気がするけど、React だとどうなんだろう。えらい人教えてください。
docker-compose run --rm app sh -c 'npx create-react-app 任意のプロジェクト名 --template typescript && cp -RT 任意のプロジェクト名/. ./ && rm -rf 任意のプロジェクト名'
3. コマンド例: 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コマンドを使うときに
*
を使うと隠しフォルダがコピーされないため、代わりに.
を使う。
Dockerfile
, docker-compose.yml
修正
4. 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:ポート番号/ をブラウザで開いてもつながらない。
docker-compose build
6.
docker-compose up
7. 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