Skip to content

Best practices for Dockerfile

  1. Уменьшить контекст, чтобы меньше тащить в образ: добавить node_modules в .gitignore или собирать не через точку в конце'.' а указать диру где только нужные для образа исходники

  2. Используем alpine или distroless, фиксируем версии образов

  3. Multistage образы

  4. сначала билдим
  5. затем подключаем только cбилденный dist (через nginx например)

  6. Порядок слоев важен для эффективности кэша

если RUN npm ci ставит зависимости и перед ней добавляются файл через COPY, то так как исходники проекта меняются, то npm ci будет запускаться, чтобы этого не было поднять инстал зависимостей выше.

  1. Настройка кэша в CI\CD

  2. Предварительное создание образа

  3. Запуск не из под root на контейнерах с пользовательскими приложениями

Examples:

Dockerfile - image 1.4 Gb

FROM node:16-alpine
WORKDIR /app
COPY . .
RUN npm install shelljs && npm install
EXPOSE 3000
CMD["npm", "start"]

Dockerfile - image 45 Mb

FROM node:16-alpine as builder
WORKDIR /app
COPY package*.json .
RUN npm ci
COPY . .
RUN npm run build --prod

FROM nginx:1.25.2-alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx/static.conf /etc/nginx/conf.d
COPY --from=builder /app/dist /app/dist

server {
    listen 80 default_server;
    server_name localhost;
    charset utf-8;
    root /app/dist;

    location / {
        try_files $uri $uri/ /index.html;
    }
}