我建立了一个具有以下文件结构的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/