На главную
Контейнеры и 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 # из чего он сложился по слоям