概要
本記事は、Windows環境で「Dockerを使ってExpoベースのiOSアプリ開発」をやりたいと考えたところからスタートし、様々な問題に直面しつつ、最終的にWSL2上にNode.js/npmをインストールして環境を整えた過程をまとめたものです。
「Dockerで全部完結させたい」と考えていたらネットワークやバージョン、ファイアウォールの壁にぶつかり、結果としてWSL内でのnpm利用へシフトすることで解決に近づいた、という開発ストーリーです。
前提環境
- Windowsマシン
- WSL2(Ubuntu等)
- Node.js / npm(最終的にWSL上にインストール)
- Expo CLI(
npx
経由で使用) - Docker(当初はDocker内でNode/npmを完結させたかったが、のちにWSL側でnpm installする流れに変更)
目標と経緯
-
当初の目的: Dockerを使い、コンテナ内で
expo start
などを実行し、iOS実機でアプリをプレビューしたい -
問題発生: ネットワークやファイアウォール、Node.jsバージョン、
expo doctor
コマンド非対応など、様々なトラブル -
方針転換: Dockerのみで環境完結を断念し、WSL上でNode.js/npmを使って
npm install
を行う- ホスト(WSL)側で
npm install
→ Dockerは最小限のセットアップのみ - Node.jsを最新化(14以上)でオプショナルチェイニング問題解消
- ネットワーク問題が改善し、iOS実機で画面表示可能に
- ホスト(WSL)側で
よく遭遇した問題
-
expo start
でiPhoneからアクセス不可- ファイアウォールやLAN設定、Docker-WSL間のネットワーク、
--lan
や--tunnel
の使い分けがカギ
- ファイアウォールやLAN設定、Docker-WSL間のネットワーク、
-
Unexpected token ?
/Unexpected token .
SyntaxError- Node.jsバージョンが古い → Node.jsを14以上に更新で解消
-
expo doctor
が使えずexpo-doctor
が必要-
npm install expo-doctor
後、npx expo-doctor
で診断可能
-
-
@types/react-native
不要警告-
npm uninstall @types/react-native
で対応、react-native
本体に型定義あり
-
対処アプローチ
Node.js / npm をWSL上にインストール
当初はDockerコンテナ内でnpm install
等を完結させたかったが、
ネットワークやOSレイヤ差異で詰まりやすく、WSL上(Ubuntu)でNode.js/npmを用いてnpm install
する方針に転換。
node -v
でNode.jsバージョンを14以上に上げることでオプショナルチェイニング問題も解消。
Dockerfileの簡略化
FROM node:18-bullseye
RUN apt-get update && \
apt-get install -y --no-install-recommends \
git \
watchman \
python3 \
make \
g++ \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app EXPOSE 19000 19001 19002 CMD ["bash"]
以前はDocker内でグローバルインストールやnpm install
をしていたが、
WSLでnpm install
を完了した状態で-v $(pwd):/app
マウントし、npx expo start
を実行する流れに変更。
Dockerは最低限のツールセットのみ。
コマンド例(Docker使用時)
bash
# WSL上で依存関係インストール
cd /mnt/c/k-iizuka000/cat-calorie-planner/expo-app
npm install
# Dockerで起動
docker run -it --rm \
-v $(pwd):/app \
-p 19000:19000 -p 19001:19001 -p 19002:19002 \
expo-env npx expo start --lan
WSL上で準備したnode_modules
を利用。
--lan
で局所的なネットワーク接続を試し、それでもダメならtunnel
モードを検討。
トンネルモード
npx expo start --tunnel
でngrokを介したアクセスが可能になります。
LAN問題やファイアウォールによるブロックを回避できる可能性があり、
--lan
モードでうまくいかない場合は--tunnel
を試してみるとよいです。
iOS実機までの道のり
- ファイアウォール無効化や別ネットワーク(テザリング)での接続確認
-
expo-doctor
で依存関係チェック、@types/react-native
削除など細かい改善 - 結果的にWSLでnpm管理、Dockerは補助的環境として機能し、iOS実機で画面表示に成功
最終的な成果
- Dockerだけで完結させるのは困難だったが、WSL上でnpmを利用しNode.jsアップデートで問題解消に近づいた
- ExpoでQRコード表示→iOS実機で実際に画面表示を確認
- 多方面からのアプローチ(Nodeバージョンアップ、ファイアウォール確認、tunnel使用、
expo-doctor
利用)で一歩ずつ前進
まとめ
- Windows + WSL + Docker + ExpoでiOS実機テストはハードルが多い
- 当初「Dockerですべて完結」の考えを改め、WSL上でnpmを利用する方針に変更したことで道が開けた
- ネットワーク・バージョン・依存関係を一つずつ解消すれば、最終的にiOS実機でのプレビューまで可能
- 同様の環境構築に挑む方が参考になるよう、本記事で得た知見を共有