Docker + React
npx create-react-app my-app --template typescript --use-npm
.
├── .devcontainer
│ ├── Dockerfile
│ └── devcontainer.json
└── my-app
├── .gitignore
├── README.md
├── node_modules
├── package-lock.json
├── package.json
├── public
├── src
└── tsconfig.json
my-app内は1階層あげる
←package.jsonはプロジェクトフォルダ直下に置きたい
↑は適当なNodeコンテナを作り中にはいって
npm install -g create-react-app
した
これは一回作ったらもういらない
よくあるVolumeのcachedオプションとはなにかについて
VSCodeで接続して編集するこの環境の場合、delegatedでいいのではと思った
速度の問題が出てきたら再考する
Linux 上ではホストとコンテナ間で VFS を基盤に共有しているので、オーバーヘッドのない反映を保証します。しかしながら、 macOS (および他の Linux 以外のプラットフォーム)では、完全な一貫性を保つために著しいオーバーヘッドがあります。
ボリューム・マウント(共有ファイルシステム)のためのパフォーマンス・チューニング — Docker-docs-ja 19.03 ドキュメント
WSLなら関係ない?
Docker Desktop leverages that to handle bind mounts from a WSL 2 distro without involving any remote file sharing system. This means that when you mount your project files in a container (with docker run -v ~/my-project:/sources <...>), docker will propagate inotify events and share the same cache as your own distro to avoid reading file content from disk repeatedly.
Docker Desktop: WSL 2 Best practices - Docker Blog
←この記事重要そうだから後で読みたい
マウント先がWSLのファイルシステム上ならよさげ
node_modulesどうする問題
せっかくコンテナ使ってるんだし依存関係のライブラリはコンテナ内にのみ残したい
→ 開発してないときはイメージ削除すれば容量も減る。作って捨てる開発環境にする
ただしnode_modulesを作ったあとにマウントするとnode_modulesのあるコンテナ内(イメージ内)のプロジェクトに上書きしてしまう → node_modules
が消えた!問題が発生
Volume Trickで行ける
その他node_modules
をプロジェクトフォルダから移す選択肢もある
参考記事
↓多分コレが元記事The node_modules Volume Trickあたりの翻訳がひどいので原文を読む
- build時に
npm install
でnode_modules
フォルダができる - コンテナ起動&マウント。色々マウントされて1の
node_modules
が隠れる - もっかいマウント。今度はデータボリュームの
node_modules
をマウント
イメージビルド時に、既にデータボリュームは作成されている?
だからビルド時にできたnode_modules
(ライブラリ入)のデータはデータボリュームとして既に避難している
2で隠れてしまうけど(この時に空のディレクトリが上書きされないのが不思議)、3でもっかい上書きするイメージ
#TODO データボリュームの仕様を調べる
プロジェクトフォルダにインストールしてから別のフォルダに退避→そのフォルダにパスを通す作戦
これが効かない問題
別にいいけど
RUN echo "PS1='\033[32m\u@\h \033[35m\t \033[34m\w \033[0m$ '" >> ~/.bashrc
みんなdocker-compose使っている問題
データボリュームとしてライブラリを持っている
これはコンテナが死んでも消えない
だったらビルド時に毎回npm install
する必要なくない?
結論
FROM node:latest
USER node
WORKDIR /workspaces/react-tutorial
COPY package.json package-lock.json ./
RUN npm install && npm cache clean --force
# Volume Trick
VOLUME /workspaces/react-tutorial/node_modules
EXPOSE 3000
ENV TZ Asia/Tokyo
こんな感じにした
# 多分所有者変えないとnpm installできない
COPY package.json package-lock.json ./
# Volume Trick
VOLUME node_modules:/workspaces/react-tutorial/node_modules
だと動かないので注意
おそらくCLIやdocker-composeならデータボリューム名を指定できる
所有者変えないと。。。
#8 2.887 npm ERR! code EACCES
#8 2.888 npm ERR! syscall open
#8 2.888 npm ERR! path /srv/chat/package-lock.json
#8 2.889 npm ERR! errno -13
#8 2.893 npm ERR! Error: EACCES: permission denied, open '/srv/chat/package-lock.json'
#8 2.893 npm ERR! [Error: EACCES: permission denied, open '/srv/chat/package-lock.json'] {
#8 2.893 npm ERR! errno: -13,
#8 2.893 npm ERR! code: 'EACCES',
#8 2.893 npm ERR! syscall: 'open',
#8 2.893 npm ERR! path: '/srv/chat/package-lock.json'
#8 2.893 npm ERR! }
#8 2.894 npm ERR!
#8 2.894 npm ERR! The operation was rejected by your operating system.
#8 2.894 npm ERR! It is likely you do not have the permissions to access this file as the current user
#8 2.894 npm ERR!
#8 2.894 npm ERR! If you believe this might be a permissions issue, please double-check the
#8 2.894 npm ERR! permissions of the file and its containing directories, or try running
#8 2.894 npm ERR! the command again as root/Administrator.
#8 2.921
#8 2.921 npm ERR! A complete log of this run can be found in:
#8 2.921 npm ERR! /home/node/.npm/_logs/2021-07-07T06_08_56_702Z-debug.log
COPY時点では所有者はroot
total 20
-rw-r--r-- 1 root root 14280 Jul 7 06:03 package-lock.json
-rw-r--r-- 1 root root 539 Jul 7 06:03 package.json
ホットリロード効かない問題
どいつもこいつもCHOKIDAR_USEPOLLINGをtrueにセットしろとしか言ってこない
全く改善せずにアレコレしてたら結局npm audit fix --force
で解決した
良かった
npm update
でもいけるかも
そもそも論コンテナ開発すべきかについて
非常に参考になる
言語サーバーの問題はVSCodeサーバーで解決するか
IOの問題はもう少し触ってみないと分からない
Macだと厳しい模様
というかそもそも独立した環境というコンテナのメリットがフロント開発で活かせない
普通にホストにNodeインストールすればよくね?ていう
環境依存ということがフロントエンドにおいてはない(フロントにとっての環境=ブラウザ)
もともとはバックエンドのための技術なわけだろうから、今後どう浸透していくのか、あるいはしないのか
ESLintとPrettier周り
闇。
そもそもESlintしようとしたらこうなる
npx eslint 'src/index.js'
Oops! Something went wrong! :(
ESLint: 7.30.0
ESLint couldn't find the config "react-app" to extend from. Please check that the name of the config is correct.
The config "react-app" was referenced from the config file in "/workspaces/react-tutorial/package.json".
If you still have problems, please stop by https://eslint.org/chat/help to chat with the team.
🤮🤮
感想
正直まだまだnoob
フロントエンドの群雄割拠感… ←選択肢が多いこと自体はいい
フロントエンドエンジニアすごい
初心者には障壁高すぎる → 大したことしないのならローコードツールがいいのかも?今度触る
デザイナーがコーディングをしたがらない理由になりそう
フロントエンド嫌いになりそう
Next.jsのZeroConfigに興味が出た