Порядок копирования в Docker
Порядок копирования ставит файл
зависимостей раньше кода, чтобы
правка скрипта не повторяла
установку.
Сначала в образ попадает
только package.json,
затем идёт npm install,
и уже после - server.js.
Если изменился только
server.js, слой с
установкой пакетов остаётся
в кэше сборки.
Пересборка заново выполняет
лишь шаги после правки
скрипта.
Файл Dockerfile:
FROM node:24
WORKDIR /app
COPY package.json .
RUN npm install --omit=dev
COPY server.js .
CMD ["node", "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 пуст,
команда start указывает
на server.js:
{
"name": "app",
"scripts": {
"start": "node server.js"
},
"dependencies": {}
}
Сервис с портом 3000
в описании проекта:
services:
app:
build: .
ports:
- "3000:3000"
Измените текст ответа
в server.js, пересоберите
и сравните время сборки
с полной установкой npm.
Запуск с пересборкой:
docker compose up -d --build
Соберите сервис hub, где package.json копируют до server.js, а ответ страницы - hub.
Поправьте только скрипт и убедитесь, что установка npm не повторилась в логе сборки.