如何解决纱线构建错误 - 错误:ENOTEMPTY: directory not empty, rmdir '/frontend/out/node_modules/cacache/node_modul

Posted

技术标签:

【中文标题】如何解决纱线构建错误 - 错误:ENOTEMPTY: directory not empty, rmdir \'/frontend/out/node_modules/cacache/node_modules/.bin\'【英文标题】:How to solve yarn build error - Error: ENOTEMPTY: directory not empty, rmdir '/frontend/out/node_modules/cacache/node_modules/.bin'如何解决纱线构建错误 - 错误:ENOTEMPTY: directory not empty, rmdir '/frontend/out/node_modules/cacache/node_modules/.bin' 【发布时间】:2021-02-14 02:13:34 【问题描述】:

我在 Docker Compose 中使用 NextJS、Django、Postgres、nginx 部署项目,它在本地 (ubunutu 18.04) 中运行良好。但在服务器(ubuntu 20.04)中,它会引发Error: ENOTEMPTY: directory not empty, rmdir '/frontend/out/node_modules/cacache/node_modules/.bin' 错误。如何解决这个问题。 附言我正在使用wait-for.sh作为前端等待api服务准备好(否则我也会得到构建错误),我的本地docker版本是Docker version 19.03.12, build 48a66213fe,我的服务器docker版本是Docker version 19.03.11, build dd360c7可能是错误的原因?

我的前端服务 Dockerfile:

USER root
WORKDIR /frontend
COPY . /frontend

# Add wait-for-it
COPY wait-for.sh wait-for.sh
RUN chmod +x wait-for.sh

RUN yarn

我的 docker-compose.yml:


services:
  db:
    image: postgres:12.0-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=purple_postgres_user
      - POSTGRES_PASSWORD=purple_p@ssW0rd
      - POSTGRES_DB=purple_db
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    #    command: ./manage.py purple.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - ./backend/:/home/purple_user/purple/
      - static_volume:/home/purple_user/purple/static/
      - media_volume:/home/purple_user/purple/media/
    expose:
      - 8000
    ports:
      - 8000:8000
    env_file:
      - ./.env.dev
    depends_on:
      - db
  nginx:
    build: ./nginx
    ports:
      - 80:80
    volumes:
      - static_volume:/var/www/staticfiles/
      - media_volume:/var/www/mediafiles/
      - build_folder:/var/www/frontend/
    depends_on:
      - web
  frontend:
    container_name: frontend
    build:
      context: ./frontend
    volumes:
      - build_folder:/frontend/out
    depends_on:
      - web
    command: ./wait-for.sh web:8000 -- yarn build
volumes:
  postgres_data:
  static_volume:
  media_volume:
  build_folder:```

【问题讨论】:

是什么产生了错误(Dockerfile 中的RUN yarn)?您是否有一个 .dockerignore 文件导致该文件夹从图像中排除?该图像应该运行的CMD 是什么? 就我而言,这是因为我在尝试删除的目录中打开了一个资源管理器窗口 是否安装了实时服务器扩展? @DavidMaze 在最后一步中引发的错误,在 docker-compose 文件中指定,前端服务命令规范。图像 CMD 在 docker-compose 文件中指定,该文件为 ./wait-for.sh web:8000 -- yarn buildwait-for.sh 是我用于服务等待另一个服务的脚本。之后yarn build 命令被执行,这就是引发错误的地方。 @Ashok 不,没有任何窗口打开,实时服务器扩展也不是这样。因为我在服务器中运行docker-compose up 命令。错误是在服务器中引发的,而不是在本地引发的。 【参考方案1】:

对我来说,解决方案是删除名为build_folder 的前端服务卷。要获得构建文件夹的正确名称,您可以运行 docker volume ls - 对我来说是 Purple_build_folder - 并通过运行 docker volume rm [volume name] 命令删除文件夹。

【讨论】:

【参考方案2】:

Docker 中的命名卷是持久的。当你的docker-compose.yml 文件有

volumes:
  - build_folder:/frontend/out

它会将先前构建的结果存储在build_folder 中,并且下次运行此容器时它们仍然存在。这就是导致您看到的错误消息的原因。

我会避免设置 Compose 服务只是为其他服务构建文件。相反,使用multi-stage build 在图像构建时构建工件。相反,在您的 Nginx 映像 Dockerfile 中,构建前端应用程序:

FROM node:12 AS frontend
WORKDIR /frontend
COPY frontend/package.json frontend/yarn.lock .
RUN yarn install
COPY frontend .
RUN yarn build

FROM nginx
# ... whatever this Dockerfile had before ...
# (except, change `COPY stuff /image/path` to `COPY nginx/stuff /image/path`)
COPY --from=frontend /frontend/out /var/www/frontend

您可以使用与COPY 静态文件--from 您的web 图像类似的技术;要么使用额外的构建阶段,COPY 它们直接来自构建上下文,要么COPY --from 单独构建图像的名称。 (这有点难以编排,因为 Compose 不会对依赖的构建进行排序。)这避免了类似的问题,即 static_volume 的内容在两个图像中隐藏已更改的静态文件。

services:
  nginx:
    # The build context must be an ancestor of anything that
    # it needs to `COPY` in.  Since we `COPY` from both the `frontend`
    # and `nginx` directories, we need to specify
    build: .
    ports: ['80:80']
    depends_on: [web]
    # No `volumes:`; the image is self-contained
  # No build-only `frontend` container

【讨论】:

但是,为什么这在我的本地计算机上有效,而不是在服务器上?

以上是关于如何解决纱线构建错误 - 错误:ENOTEMPTY: directory not empty, rmdir '/frontend/out/node_modules/cacache/node_modul的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ant Design 构建纱线失败

npm install of angular throws 错误:ENOTEMPTY

无法清除此错误 - 安装 Expo CLI 时的 ENOTEMPTY

Next.js 纱线构建因 plotly.js 失败(发生构建错误 ReferenceError: self is not defined)

在 Angular CLI 应用程序中安装 express 时出现“ENOTEMPTY:目录不为空,rmdir .....”错误。

ENOTEMPTY:目录不为空,rmdir