На главную

Контейнеры и CI/CD

Dockerfile по стеку

Собирает многоступенчатый Dockerfile для Node, Python, Go, PHP и Java: зависимости отдельным слоем, запуск не от root и .dockerignore, без которого в образ уезжает .git.

Настройки

Dockerfile

# syntax=docker/dockerfile:1

FROM node:22-alpine AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci

FROM node:22-alpine AS build
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build

FROM node:22-alpine AS runtime
WORKDIR /app
ENV NODE_ENV=production
COPY package*.json ./
RUN npm ci --omit=dev
COPY --from=build /app/dist ./dist
USER node
EXPOSE 3000
CMD ["node","dist/main.js"]

.dockerignore

.git
.gitignore
.github
.vscode
.idea
Dockerfile
.dockerignore
docker-compose*.yml
README.md
LICENSE
docs
.env
.env.*
*.log
tmp
.DS_Store
node_modules
npm-debug.log*
coverage
dist
.next
.nuxt

Почему так

  • Слой зависимостей отделён от кода: правка исходников не пересобирает npm ci.
  • В образах node пользователь node существует изначально — создавать его не нужно.
  • .dockerignore обязателен: без него в контекст сборки уезжает .git и локальные зависимости, а вместе с ними — .env.

Сборка и запуск

docker build -t my-app:1.0.0 .
docker run --rm -p 3000:3000 --name my-app my-app:1.0.0
docker image ls my-app          # посмотреть размер образа
docker history my-app:1.0.0     # из чего он сложился по слоям