Почему Docker не запускается и выдает ошибку "sh: vite: not found"?

Здравствуйте! Я столкнулся с проблемой при запуске Docker-контейнера — он не может найти Vite. Я просмотрел документацию и проверил, что все файлы и пакеты верно установлены и указаны в package.json, но решение так и не нашёл. Поскольку я только недавно начал изучать фронтенд, возможно, я что-то не понимаю и не могу правильно сформулировать свой запрос в поисковых системах. Может быть, кто-то из вас сталкивался с подобной проблемой? 

Вот мой Dockerfile: 
<pre><code class="javascript">ARG NODE_VERSION=23.3.0

FROM node:${NODE_VERSION}-alpine

ENV NODE_ENV development

WORKDIR /usr/src/app

RUN --mount=type=bind,source=package.json,target=package.json \
    --mount=type=bind,source=package-lock.json,target=package-lock.json \
    --mount=type=cache,target=/root/.npm \
    npm ci --omit=dev

COPY . .

EXPOSE 8080

CMD npm run dev</code></pre>

Вот ошибка, с которой я столкнулся: 
<pre><code>(node:1) ExperimentalWarning: CommonJS module /usr/local/lib/node_modules/npm/node_modules/debug/src/node.js is loading ES Module /usr/local/lib/node_modules/npm/node_modules/supports-color/index.js using require().
2025-01-13T14:07:15.704169057Z Support for loading ES Module in require() is an experimental feature and might change at any time
2025-01-13T14:07:15.726850436Z 
2025-01-13T14:07:15.726924240Z &gt; vite_react_shadcn_ts@0.0.0 dev
2025-01-13T14:07:15.726935440Z &gt; vite
2025-01-13T14:07:15.726939640Z 
2025-01-13T14:07:15.735636716Z sh: vite: not found</code></pre>
  • 13 января 2025 г. 14:54
Ответы на вопрос 2
Ошибка "sh: vite: not found" указывает на то, что команда `vite` не может быть найдена в окружении вашего Docker-контейнера. Это может происходить по нескольким причинам. Давайте рассмотрим возможные источники проблемы и их решения.

### 1. Установка Vite
Убедитесь, что Vite действительно установлен в вашем проекте. Даже если он указан в `package.json`, он может не быть установлен, если команда `npm ci` не выполнится корректно. В вашем Dockerfile сначала устанавливаются пакеты, а затем происходит копирование остальных файлов. Убедитесь, что Vite там установлен.

### 2. Убедитесь, что Vite установлен как зависимость
Проверьте, что `vite` указан в секции `dependencies` или `devDependencies` в вашем `package.json`, например:

```json
{
  "devDependencies": {
    "vite": "^latest"
  }
}
```

### 3. Использование локальных зависимостей
Когда вы запускаете команду `npm run dev`, она пытается запустить `vite` как локальную зависимость проекта. Убедитесь, что вы вызываете `npm run dev` из того места, где находится ваш `node_modules` и где установлен `vite`. Если вы хотите быть уверены, что Vite доступен, вы можете явно указать путь:

```json
"scripts": {
    "dev": "node_modules/.bin/vite"
}
```

Альтернативно вы можете просто использовать `npx vite`, так как `npx` автоматически найдет исполняемый файл в `node_modules`.

### 4. Пересоздание контейнера
После внесения изменений в `package.json` или Dockerfile не забудьте пересоздать контейнер, чтобы изменения вступили в силу. Вы можете это сделать с помощью команд:

```bash
docker-compose down
docker-compose up --build
```
или, если вы используете `docker` напрямую:

```bash
docker build -t your-image-name .
docker run your-image-name
```

### 5. Режим разработки (dev)
Если вы видите, что `vite` находится только в `devDependencies`, убедитесь, что у вас правильно настроены параметры среды. Обратите внимание на использование `npm ci --omit=dev`, которое не устанавливает dev-зависимости. Вам, скорее всего, нужно удалить `--omit=dev` из команды.

### 6. Убедитесь, что все зависимости установлены
С также проверьте свой локальный проект, чтобы убедиться, что всё работает вне Docker. Запустите:

```bash
npm install
npm run dev
```

Если всё работает локально, но не в Docker, то причина, скорее всего, в настройках Docker.

### Пример исправленного Dockerfile
Попробуйте следующий вариант вашего Dockerfile:

```dockerfile
ARG NODE_VERSION=23.3.0

FROM node:${NODE_VERSION}-alpine

ENV NODE_ENV development

WORKDIR /usr/src/app

COPY package.json package-lock.json ./

RUN npm install

COPY . .

EXPOSE 8080

CMD ["npm", "run", "dev"]
```

### Заключение
Убедитесь, что Vite установлен и доступен в вашем проекте, а затем пересоздайте контейнер. Надеюсь, это поможет решить вашу проблему! Если проблема сохранится, пожалуйста, предоставьте больше информации о вашем `package.json` и о том, как вы запускаете Docker.
RUN --mount=type=bind,source=package.json,target=package.json \
    --mount=type=bind,source=package-lock.json,target=package-lock.json \
    --mount=type=cache,target=/root/.npm \
    npm ci --omit=dev


это нужно делать не в докер контейнере, а монтировать в рантайме при запуске. Либо копировать COPY локальные папки в контейнер.
Похожие вопросы