Запуск Jest в режиме --watch в контейнере Docker в подкаталоге git root - PullRequest
0 голосов
/ 20 марта 2020

Я создал веб-проект со следующей файловой структурой:

-root_folder/
  -docker-compose.yml
  -.git/
  -backend/
    -.dockerignore
    -docker/
      -dev.dockerfile
  -frontend/
    -.dockerignore
    -docker/
      -dev.dockerfile

Я запускаю приложение внешнего интерфейса (Angular) в Docker контейнере. Я также запускаю приложение бэкэнда (ExpressJS) в другом контейнере, но бэкэнд не имеет отношения к моей проблеме.

Я смонтировал том ./frontend в / app в контейнере, чтобы разрешить горячую перезагрузку.

Эта конфигурация работает для запуска Angular просто отлично. Однако при запуске Jest с флагом --watch выдает ошибку --watch is not supported without git/hg, please use --watchAll

Я вернулся в dockerfile и добавил:

RUN apk update -q && \
    apk add -q git

Но это не решает проблему , Из всех исследований, которые я провел, похоже, проблема в том, что в режиме наблюдения Jest для обнаружения изменений каким-то образом используется git, но моя папка git не находится в подкаталоге 'frontend'.

I попытался изменить мой контейнер, чтобы вместо этого скопировать все файлы в / app / frontend, а затем также скопировать и смонтировать папку git в /app/.git, но это не дало результата.

Я делаю не хочу запускать Jest с --watchAll (но я проверил его, и он работает правильно). Есть предложения?

РЕДАКТИРОВАТЬ Ответили на мой вопрос. Я был на правильном пути с монтированием папки. git. Отсутствующим шагом была установка переменных среды GIT_WORK_TREE и GIT_DIR.

1 Ответ

0 голосов
/ 21 марта 2020

Я смог заставить это работать именно так, как я хотел. Проблема заключается в том, что для запуска Jest в режиме наблюдения он просматривает измененные файлы в соответствии с Git. Я смог заставить эту функцию работать, настроив структуру каталогов на контейнере, аналогичную моей хост-системе, с помощью:

-app/
  -.git/
  -frontend/

Затем, что наиболее важно, установив переменные среды GIT_WORK_TREE и GIT_DIR.

Вот мой dockerfile:

FROM node:alpine3.11 as dev

WORKDIR /app/frontend

# To use packages in CLI without global install
ENV PATH /app/frontend/node_modules/.bin:$PATH

COPY . .

RUN npm install --silent

EXPOSE 4200

CMD ["/bin/sh", "-c", "npm run start:dev"]

##########################################################
FROM dev as unit-test

ENV GIT_WORK_TREE=/app/frontend GIT_DIR=/app/.git

RUN apk update && \
    apk add git

CMD ["/bin/sh", "-c", "jest --watch"]

Без установленного env vars Jest продолжает выдавать ошибку, что он не может работать без git. Я предполагаю, что это потому, что git init никогда не запускался, и он, вероятно, делает некоторые другие вещи за кулисами, что копирование в папке. git не выполняется sh.

Вот docker -compose Я использовал для тестовой службы, если она кому-то помогает:

  f-test-unit:
    container_name: "f-test-unit"
    build:
      context: "frontend"
      dockerfile: "docker/dev.dockerfile"
      target: "unit-test"
    volumes:
      - "./frontend:/app/frontend"
      - "/app/frontend/node_modules/"
      - "./.git:/app/.git"
    tty: true
    stdin_open: false

Примечание: если вы добавите строки tty и stdin_open, это позволит раскрасить ваши журналы в контейнере docker , что очень полезно с Jest.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...