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

标签 node.js git docker jestjs

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

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

我在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

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

我试图修改容器,以将所有文件复制到/ app / frontend,然后再复制.git文件夹并将其安装到/app/.git,但这没有任何效果。

我不想使用--watchAll运行Jest(但是我对其进行了测试,并且确实可以正常运行)。有什么建议么?

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

最佳答案

我能够完全按照我的意愿进行工作。问题在于,为了使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文件夹中的复制未完成。

这是我用于测试服务的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非常有用。

关于node.js - 在git root子目录中的Docker容器中以--watch模式运行Jest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60768371/

相关文章:

javascript - MERN 堆栈 : How to prevent a User from registering (being added to an array) multiple times?

node.js - IE 中未定义“代理”

使用 Google Cloud Storage 的 Git 大文件存储

通过终端的 GIT checkout 分支

C#编译错误: Can't find main from *. csproj文件

javascript - 在node.js中设置Apache环境变量

javascript - 无法理解 meteor 特定语法

c# - fork 了一个项目,但是.pp 是什么?

python - 无法在 Postgresql plpython 函数中导入自己的 python 模块

docker 错误 : invalid reference format: repository name must be lowercase