Каталог зависимостей в Docker
Каталог зависимостей на хосте
пустой и затирает пакеты,
которые уже лежали в образе.
Том ./app:/app подменяет
весь /app, включая
node_modules из слоя
сборки.
Шаблон ставит пакеты
на этапе образа.
Файл app/Dockerfile:
FROM node:24
WORKDIR /app
COPY package.json .
RUN npm install
COPY server.js .
CMD ["node", "server.js"]
Скрипт app/server.js
слушает 3000 и отдаёт
hello:
const http = require('node:http');
const server = http.createServer((req, res) => {
res.end('hello');
});
server.listen(3000, '0.0.0.0');
В package.json
список dependencies
пуст - установка всё равно
создаёт каталог в образе:
{
"name": "app",
"scripts": {
"start": "node server.js"
},
"dependencies": {}
}
Второй том без имени слева
держит /app/node_modules
отдельно от папки проекта.
Без этой строки пустой
node_modules с хоста
скрывает каталог из образа.
Файл compose.yaml:
services:
web:
build: ./app
ports:
- "3000:3000"
volumes:
- ./app:/app
- /app/node_modules
Подъём с пересборкой поднимет сервис с кодом с диска и пакетами из образа. Запуск проекта:
docker compose up -d --build
Соберите сервис pkg с установкой npm в образе и двумя томами, чтобы каталог пакетов не затирался с хоста.
Откройте localhost:3000 и проверьте ответ hello.