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