В Dockerfile build multistage определяются блоки для 2х контейнеров, первый используется для сборки, второй для production, он получает и использует результат полученный в первом контейнере.
Рассмотрим на примере контейнеризированного приложения на npdejs
Dockerfile для самого приложения в dev окружении такой
FROM node:alpine
WORKIR '/app'
COPY ./package.json ./
RUN npm install
COPY . .
CMD ["npm", "run", "start"]
В prod окружении меняется только команда CMD npm run start -> npm run build
Меняется имя файла и его вызов в docker-compose.yml. Вызывается Dockerfile.dev или просто Dockerfile
Когда нужно указание Dockerfile в docker-compose.yml image как здесь, используется директива build . и dockerfile: имя_файла
build:
context: <folder>
dockerfile:Dockerfile
Dockerfile multistep build для prod окружения будет выглядеть так:
FROM node:alpine as builder
WORKDIR '/app'
COPY ./package.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx
EXPOSE 3000
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf
COPY --from=builder /app/build /usr/share/nginx/html
Для отдачи nginx потребуется простейшая конфигурация:
server {
listen 3000;
}
location / {
root /usr/share/nginx/html;
index index.hrml index.htm;
}
На выходе приложение собрано и представлляет собой html файлы