Найти тему
Codogenerator

Упаковываем React App в Docker контейнер

Оглавление
Дружим React JS приложение с докером ...
Дружим React JS приложение с докером ...

Но про backend мы поговорим позже, а пока начнем с фронтов.

"Зачем это надо?" - спросите вы! Все просто. Приложение должно легко переноситься не только кодовой базой из гитов на сервер разработки или production, но и избавлять от головной боли в следующем:

  • Нет необходимости тратить время новых разработчиков на настройку workflow
  • Легко подниматься если сервер чист, достаточно поднять докер и "стартануть" контейнер
  • Проще создавать отказоустойчивые стенды, оркестрируя трафиком на контейнеры и балансируя нагрузку
  • Легче осуществлять переход с одной версии приложения на другую, хранить ранее собранные ветки в docker-registry с тегами
  • Удобнее пользоваться yml, чем с нуля писать какие-то sh для deploy
  • и многое другое, пиши в комментариях если есть предложения

Плоский юмор: Вот мы и создали наш hello world на реакте и готовы подключить бекендеров для разработки. "Мы знаем только Jar", говорят они, а вы нам про какой-то Yarn :-)

Поехали ...

Создаем в корне проекта файл default.conf Зачем? Нам надо чтобы приложение с несколькими роутингами нормально работало как single page application. Внутри него будет конфигурация Nginx. Для начала ничего не надо менять.

server {
listen 80;
server_name localhost;

location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri /index.html;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

Создадим абсолютно там же на Dockerfile

# Stage 1
FROM node:8 as simple-build

WORKDIR /app
COPY . ./
RUN yarn
RUN yarn build

FROM nginx:alpine
COPY --from=simple-build /app/build /usr/share/nginx/html
COPY /default.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Далее собираем контейнер

docker build . -t my-simple-docker

Все! Если настроить docker-registry, то можно сделать так:

docker login
docker push your-host:5000/my-simple-docker:latest

На целевом сервере:

docker login
sudo docker pull your-host:5000/my-simple-docker:latest
sudo docker run -d -p 8000:80 your-host:5000/my-simple-docker:latest

Автоматическая сборка с помощью Gitlab CI

Создаем файл gitlab-ci.yml и пушим его в git репозиторий. Заранее, конечно, в runners необходимо добавить условие запуска, например по тегу deploy-dev-123, где 123 произвольная часть.

image: docker:git
services:
- docker:dind
variables:
DOCKER_DRIVER: overlay

before_script:
- docker login -u user -p password host-to-docker-registry.ru:5000
dev-version:
stage: deploy
script:
- docker build -t host-to-docker-registry.ru:5000/${CI_JOB_NAME}:latest .
- docker push host-to-docker-registry.ru:5000/${CI_JOB_NAME}:latest
only:
- /^deploy-dev-.*$/

Что в итоге? Вы легко можете отдать проект следующему специалисту для настройки бекендной части и как результат получить единый контейнер для удобного деплоя на сервер. Надеюсь вам пригодится эта информация и вы обязательно найдете применение этому у себя в проекте. А на этом желаю успехов!

Подписывайтесь на канал, делитесь статьей и задавайте вопросы, я постараюсь ответить.