Главная | Все статьи | Дневник студента

Docker для фронта — как с ним работать

Время чтения статьи ~4 минуты
Статья написана студентом Хекслета. Мнение автора может не совпадать с позицией редакции
Docker для фронта — как с ним работать главное изображение

Я работаю фуллстек-разработчиком, но стараюсь больше заниматься фронтом и прохожу курс "Фронтенд-разработчик".

Мы сейчас пилим один проект и у нас регулярно возникает такая ситуация, что из трех разработчиков обязательно у кого-нибудь что-нибудь не работает после мержа веток — и все из-за разных версий нод на машинах, или каких-то нюансов с архитектурой процессора (у меня MacBook М1) или ОС, у кого-то Windows, у кого-то Ubuntu или MacOS.

И было принято ответственное решение как-то все привести к единому виду, чтобы у всех все работало без проблем.

Первое же, что пришло в голову — это Docker.

Docker запускает одну и ту же виртуальную среду разработки на любых операционных системах и никак не связан с версиями ноды на локальных машинах, все устанавливается внутри контейнера докера.

Как мы это сделали в двух словах, потом примеры конфигов.

  1. Сделать образ на базе которого будут запускаться контейнеры
  2. Настроить контейнеры

Образ (image) — это как флешка с установочной системой, а после установки системы запускается компьютер — это уже контейнер (container).

Структура:

project
|- /app
|- Dockerfile
|- docker-compose.yml
|- dockerignore
|- Makefile
|- .env

/app — внутри папки app находятся все файлы проекта, это как папка с проектом локально, внутри которого находятся package.json, /src, node_modules и так далее, все, что нужно для разработки

Dockerfile — инструкции для сборки образа, билдится один раз для создания контейнеров

docker-compose.yml — инструкции для запуска контейнера, имя, порты, папки и все такое

Makefile — скрипты запуска и билда

.env — переменные для изменения образа докера или контейнера


В данном случае образ собирается из официального образа Node.js 18

.env

IMAGE_NAME=frontend
CONTAINER_NAME=webapp
PORT=4444

Dockerfile

FROM node:18 # версия ноды, можно поставить любую необходимую, указав ее версию 16.4.0, например

WORKDIR /home/app

COPY ./app . # что куда копируем ./app - папка с проектом, . - рабочая директория

# что надо параллельно установить
RUN apt-get update && apt-get install -y \
    nano \
    mc \
    zsh
# установка ZSH — оболочка для терминала, очень удобная
RUN sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

# обновляем npm
RUN npm install -g npm@8.12.1
# проверка на ошибки — отключена
RUN export DOCKER_SCAN_SUGGEST=false
# порт для внешнего доступа
EXPOSE ${PORT}

docker-compose.yml

version: '3'

services:
  web: 
    build: . # откуда брать инструкции для билда

    image: ${IMAGE_NAME} # название образа

    container_name: ${CONTAINER_NAME} # имя контейнера

    restart: always # перезагрузка, если что-то пошло не так

    stdin_open: true

    tty: true # для открытия терминала после старта

    volumes:
      - "./app:/home/app" # проброс папок, что и куда разделяется двоеточием, внутри будет запущена урезанная версия Ubuntu с установленной Nodejs, структура папок точно такая же, как в обычной Ubuntu

    ports:
      - ${PORT}:${PORT} # какой порт показывать снаружи 

Makefile

################ Docker commands ################

# создание образа
build:
    docker-compose build --no-cache
# создать контейнер
up:
    docker-compose up -d; docker exec -it webapp zsh || winpty docker exec -it webapp zsh
# выключить контейнер
down:
    docker-compose down
# зайти в терминал контейнера, внутри контейнера урезанная Ubuntu, и все те же команды
bash:
    docker exec -it webapp zsh || winpty docker exec -it webapp zsh

Билд

В терминале, в папке, где лежит docket-compose.yml, т.е в корне папки project — make build

Запуск

В том же терминале — make up. После этой команды откроется терминал контейнера, т.е терминал той урезанной Ubuntu, у нее нет доступа к ресурсам локальной машины. Билд может происходить долго, в зависимости от мощности вашей машины и скорости интернета.

➜  app

Далее устанавливаем внутри этого виртуального контейнера пакеты, у меня уже есть там файл package.json с пакетами для Vite.

npm install

Далее запускаем сервер той командой, которая у вас в package.json для запуска сервера.

Выключение

➜  app exit # выкинет из виртуального терминала
# чтобы опять войти в терминал рабочего контейнера — make bash внутри папки project
make down # контейнер выключается — это как комп вырубить

.dockerignore

app/.parcel-cache/

app/node_modules/

app/dist/

docker-compose.yml

Dockerfile

.gitignore

.DS_Store

README.md

.idea/

.git/

Чтобы это все работало, надо сначала установить Docker на вашу тачку =).

Проблемы

Сборщик Parcel не работает на Windows внутри докера, причина известная, но решения пока нет. Народ пишет, что это проблема связи между локальной машиной WSL и Parcel внутри контейнера. При этом на MacOS и Ubuntu таких проблем нет, там все работает отлично.

Знаю точно, проверено, что сборщик Vite работает на всех ОС в контейнера и browser-sync отрабатывает как надо.

Webpack тоже как-то через раз работает.

Для установки докера на винду нужно проделать дополнительные танцы с бубном, установить Git Bash + WSL и пробовать сбилдить и запускать.

Спасибо за внимание =).

Аватар пользователя Victor Kasap
Victor Kasap 23 июня 2022
7
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка фронтенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 25 апреля
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Django
10 месяцев
с нуля
Старт 25 апреля
профессия
от 6 183 ₽ в месяц
Ручное тестирование веб-приложений
4 месяца
с нуля
Старт 25 апреля
профессия
от 6 300 ₽ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 25 апреля
профессия
от 5 025 ₽ в месяц
новый
Сбор, анализ и интерпретация данных
9 месяцев
с нуля
Старт 25 апреля
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Laravel
10 месяцев
с нуля
Старт 25 апреля
профессия
от 5 840 ₽ в месяц
Создание веб-приложений со скоростью света
5 месяцев
c опытом
Старт 25 апреля
профессия
от 9 900 ₽ в месяц
Разработка фронтенд- и бэкенд-компонентов для веб-приложений
16 месяцев
с нуля
Старт 25 апреля
профессия
от 6 300 ₽ в месяц
Разработка бэкенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 25 апреля
профессия
новый
Автоматизированное тестирование веб-приложений на JavaScript
8 месяцев
c опытом
в разработке
Старт 25 апреля
профессия
Верстка с использованием последних стандартов CSS
5 месяцев
с нуля
Старт в любое время