Может ли запущенный Docker контейнер не содержать скомпилированные файлы NodeJS приложения?

У меня есть Node.js приложение, состоящее из различных микросервисов, каждый из которых написан на Node.js или NestJS и содержит файлы с расширениями <code>.js</code> и <code>.ts</code>. У каждого микросервиса есть свой Dockerfile, расположенный в папке с приложением. Эти Dockerfile обычно включают схожие строки для этапа сборки, например: <br/> <br/> <pre><code class="bash">dockerfile
WORKDIR /app
RUN npm run build &amp;&amp; npm prune --production --force &amp;&amp; rm -rf src</code></pre> <br/> Я заметил, что в случае сервиса 'gateway-server' скомпилированные файлы (только .js и .js.map) находятся в папке 'app' при запуске терминала внутри работающего контейнера. Однако, для микросервиса 'keyboard-driver' в его Dockerfile отсутствуют инструкции для сборки, и когда я запускаю shell внутри этого контейнера, в папке 'app' обнаруживаю исключительно исходные файлы - <code>.ts</code> и <code>.js</code>, как это представлено в репозитории. <br/> <br/> У меня есть несколько вопросов: <br/> <br/> Как может быть так, что контейнер Node.js приложения не содержит скомпилированные файлы? Я использовал команду <code class="bash">find</code> для поиска, но не нашел ничего. <br/> <br/> Существуют ли шансы, что скомпилированные файлы могут находиться в каком-то внешнем volume или в оперативной памяти? Если да, то как можно определить их местоположение? Поможет ли команда <code>Docker inspect &lt;containerID&gt;</code> в этом? <br/> <br/> Почему разработчики могут использовать такую конфигурацию без скомпилированных файлов?
  • 22 декабря 2024 г. 15:43
Ответы на вопрос 2
Запущенный Docker контейнер может не содержать скомпилированные файлы NodeJS приложения по нескольким причинам:

### 1. Отсутствие сборки в Dockerfile
Если в Dockerfile для конкретного микросервиса, такого как `keyboard-driver`, отсутствуют команды для сборки (`npm run build`), это означает, что вы не создаете скомпилированные файлы перед копированием их в образ. В этом случае контейнер будет содержать только исходные файлы, которые были в репозитории на момент билд процесса.

### 2. Использование внешних Volumes
Скомпилированные файлы могут находиться в внешнем volume, который был смонтирован в контейнер. Это может быть сделано для обеспечения постоянного хранения данных вне контейнера. Если таком volume был смонтирован в директорию `/app`, скомпилированные файлы могут быть там, но вы не увидите их внутри контейнера. 

Вы можете определить, есть ли смонтированные volume, с помощью команды:
```bash
docker inspect <containerID>
```
Команда покажет, какие volumes были смонтированы, и на какие пути внутри контейнера они ссылаются.

### 3. Временные файлы в памяти
Скомпилированные файлы могут также находиться в оперативной памяти (например, если используются in-memory системы или кэширование). Однако, для Node.js приложений это довольно редкое, но возможное использование.

### Почему разработчики могут использовать такую конфигурацию без скомпилированных файлов?
Некоторые разработчики могут использовать конфигурацию без скомпилированных файлов по следующим причинам:

- **Простота разработки**: В процессе разработки может использоваться Typescript в режиме "on-the-fly" с помощью таких инструментов, как `ts-node`, позволяющих выполнять `.ts` файлы без предварительной компиляции. Это удобно для быстрого тестирования.
  
- **Многоуровневая архитектура**: В определенных случаях может быть предусмотрено, что скомпилированные файлы генерируются и деплоятся на другом этапе (например, через CI/CD систему), отделяя процесс разработки от производства.
  
- **Уменьшение размера образа**: Исключение скомпилированных файлов может привести к меньшему размеру образа, что может быть важно для экономии ресурсов.

- **Легкость отладки**: Наличие исходного кода в контейнере упрощает отладку. Разработчики могут исследовать и анализировать код непосредственно в контейнере, что удобно для тестирования и разработки.

Таким образом, важно проверять Dockerfile каждого микросервиса и их конфигурацию на предмет сборки и размещения файлов, чтобы понимать, как они работают.
Потому что JS не нужна компиляция, т.к. это интерпретируемый ЯП. Вики 
npm run build - это просто команда сборки, которая применяется для всяких type-script, минификации файлов для фронт-энда, компиляции бинарных зависимостей, которые как раз могут быть написаны на уже компилируемом С++ или любом другом ЯП, и всего такого прочего.
Похожие вопросы