在 git root 子目录下的 Docker 容器中以 --watch 模式运行 Jest

Sha*_*ota 2 git node.js docker jestjs

我已经构建了一个具有以下文件结构的 Web 项目:

-root_folder/
  -docker-compose.yml
  -.git/
  -backend/
    -.dockerignore
    -docker/
      -dev.dockerfile
  -frontend/
    -.dockerignore
    -docker/
      -dev.dockerfile
Run Code Online (Sandbox Code Playgroud)

我在 Docker 容器中运行前端应用程序 (Angular)。我还在另一个容器中运行后端应用程序 (ExpressJS),但后端与我的问题无关。

我已将卷 ./frontend 安装到容器中的 /app 以允许热重新加载。

这个配置可以很好地运行 Angular。但是,当运行带有 --watch 标志的 Jest 时,它给出了错误--watch is not supported without git/hg, please use --watchAll

我回到 dockerfile 并添加:

RUN apk update -q && \
    apk add -q git
Run Code Online (Sandbox Code Playgroud)

但这并不能解决问题。从我所做的所有研究来看,问题似乎是 Jest 监视模式以某种方式使用 git 来检测更改,但我的 git 文件夹不在“前端”子目录中。

我试图修改我的容器以将所有文件复制到 /app/frontend ,然后也复制并挂载 .git 文件夹到 /app/.git 但这没有效果。

我不想用 --watchAll 运行 Jest(但我测试了它并且运行正常)。有什么建议?

编辑回答了我自己的问题。我在安装 .git 文件夹时走在正确的轨道上。缺少的步骤是设置 GIT_WORK_TREE 和 GIT_DIR 环境变量。

Sha*_*ota 8

我能够完全按照我的意愿进行工作。问题是,为了让 Jest 在监视模式下运行,它通过根据 Git 查看更改的文件来实现。通过在类似于我的主机系统的容器上设置目录结构,我能够使用此功能:

-app/
  -.git/
  -frontend/
Run Code Online (Sandbox Code Playgroud)

然后,最重要的是,设置 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"]
Run Code Online (Sandbox Code Playgroud)

如果没有设置 env vars,Jest 会继续给出没有 git 就无法工作的错误。我假设这是因为git init从来没有运行过,它可能在幕后做了一些其他的事情,在 .git 文件夹中复制没有完成。

这是我用于测试服务的 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
Run Code Online (Sandbox Code Playgroud)

旁注:如果你添加 tty 和 stdin_open 行,它允许你在 docker 容器中的日志被着色,这对 Jest 非常有用。