0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Docker環境における「vite: not found」エラーについて

Last updated at Posted at 2025-03-14

はじめに

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について学び直す良い機会になった。

今回の解決方法が同様の問題に直面している方の参考になれば嬉しい。
理解が間違っているところなどあればコメントでご指摘いただけると喜びます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?