はじめに
Docker環境下でフロントエンド開発を行っていた際、npm run dev を実行すると、以下のような「vite: not found」エラーが発生した。
2025-03-13 23:58:45 frontend-1 | > frontend@0.0.0 dev
2025-03-13 23:58:45 frontend-1 | > vite
2025-03-13 23:58:45 frontend-1 |
sh: 1: vite: not found
試した対処法
viteコマンドが見つからない……?
依存関係のエラーか、viteのインストールに失敗しているのではないか、と思い一旦設定ファイルを見返すことに。
# docker-compose.yml
version: "3"
services:
backend:
build:
context: .
dockerfile: Dockerfile.backend
ports:
- "5000:5000"
volumes:
- ./backend:/app
environment:
- CHOKIDAR_USEPOLLING=true
restart: always
frontend:
build:
context: .
dockerfile: Dockerfile.frontend
ports:
- "3333:3333"
volumes:
- ./frontend:/app
environment:
- CHOKIDAR_USEPOLLING=true
tty: true
# Dockerfile.frontend
# ベースイメージとして公式のNode.jsイメージを使用
FROM node:18
# コンテナ内の作業ディレクトリを指定
WORKDIR /app
# package.jsonとpackage-lock.jsonをコピー
COPY frontend/package.json ./
COPY frontend/package-lock.json ./
# ソースコードを全てコンテナにコピー(必要に応じて .dockerignore を設定)
COPY frontend/ .
# 依存関係をインストール
RUN npm install
# コンテナ起動時にnpm run devを実行
CMD ["npm", "run", "dev"]
# package.json
{
"name": "frontend",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc -b && vite build",
"lint": "eslint .",
"preview": "vite preview",
"openapi:generate": "npx rtk-query-codegen-openapi openapi-config.ts"
},
"dependencies": {
"@reduxjs/toolkit": "^2.6.0",
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"devDependencies": {
"@eslint/js": "^9.19.0",
"@rtk-query/codegen-openapi": "^2.0.0",
"@types/react": "^19.0.8",
"@types/react-dom": "^19.0.3",
"@vitejs/plugin-react-swc": "^3.5.0",
"esbuild-runner": "^2.2.2",
"eslint": "^9.19.0",
"eslint-plugin-react-hooks": "^5.0.0",
"eslint-plugin-react-refresh": "^0.4.18",
"globals": "^15.14.0",
"openapi-typescript": "^7.6.1",
"ts-node": "^10.9.2",
"typescript": "~5.7.2",
"typescript-eslint": "^8.22.0",
"vite": "^6.1.0"
}
}
ぱっと見npm installが走ったタイミングでviteはインストールされるように見える。
Dockerのimageとcontainerを削除して走らせてみてもダメ。
RUN npm install -g viteをDockerfileに書き込んでみたが、これもダメだった。
node_modules/.binへのパスが通っていないのか?
と思い、ENV PATH="/app/node_modules/.bin:${PATH}"
も試したがやはりダメ。
どうやら本当にviteがインストールされていない様子。
解決
困り果てていたところで、https://qiita.com/shoki-y/items/1be906c372c8a9a993a3
ここにたどり着いた。
どうやらホスト側の node_modules ディレクトリをコンテナ内にマウントすることで、依存関係が正しく同期されるように対策しないといけない様子。
Dockerコンテナ内で依存関係のインストール(npm install)が完了する前に npm run dev が実行され、Viteの実行ファイルが存在しないようだ。
試しにDocker compose内へ
- /app/node_modules
を追記してみたところnpm install 実行後に生成される node_modules がコンテナ内でも参照可能となり、Viteが正しく実行されるように!
原因
Dockerの挙動について全然理解できていなかったことが一番の問題だった。
おそらく、ホスト側でファイルをコピーしたタイミングで、Dockerがまだ依存関係のインストール処理中だった可能性がある。
volumeについて学び直す良い機会になった。
今回の解決方法が同様の問題に直面している方の参考になれば嬉しい。
理解が間違っているところなどあればコメントでご指摘いただけると喜びます。