romash
@romash
web-разработчик

Как запустить docker-контейнер со статикой сайта?

Есть простой Dockerfile, который собирает проект
FROM node:8
WORKDIR /web

COPY package.json yarn.lock ./
RUN yarn

COPY . ./
RUN yarn build

yarn build вывалит в /web/dist статику сайта.
Насколько я понимаю, нужно теперь сделать ещё один контейнер с nginx и через volume подключить к нему папку со статикой, но только как тогда сделать, чтобы контейнер не выключился сразу после запуска? Команды-то в нём нет...
Или всё-таки нужно поставить nginx в этот контейнер и после сборки использовать его же для раздачи сайта? Это не будет противоречить философии Docker'а, что каждый контейнер должен выполнять свою задачу?
  • Вопрос задан
  • 866 просмотров
Решения вопроса 1
romash
@romash Автор вопроса
web-разработчик
Ответ оказался гораздо проще и красивее, чем я предполагал.
У докера с версии 17.05 появилась такая замечательная штука, как Multi-stage build. Она позволяет в одном докерфайле сначала сделать контейнер с nodejs, сбилдить в нём статику, а потом создать ещё один контейнер с nginx, в который скопировать артефакты сборки из первого. При этом результирующий образ не будет содержать данных из образа nodejs и исходников (если вы их явно на втором шаге не скопируете), что позволяет сделать его максимально лёгким.
FROM node:8 as build
WORKDIR /web

COPY package.json yarn.lock ./
RUN yarn

COPY . ./
RUN yarn build


FROM nginx:alpine
WORKDIR /usr/share/nginx/html
RUN rm -rf *
COPY --from=build /web/dist .
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Попробуйте docker-compose.
Вот пример файла docker-compose.yml:
version: "3"
services:
    my-app:
        image: my-app
        ports:
            - 3000:3000
        volumes:
            - dist:/web/dist
        networks:
            - app-network 
    nginx:
        image: nginx
        depends_on:
            - my-app
        ports: 
            - 80:80
        volumes:
            - dist:/usr/share/nginx/html
        networks:
            - app-network

volumes:
    dist:
networks:
    app-network:
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы