You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NX Next.js应用在只读Docker容器中运行失败的问题排查

问题原因

你遇到的不是build/lint这类任务的执行结果缓存,而是NX的项目图(Project Graph)缓存。这个缓存是NX用来加速项目依赖分析的核心机制,不管任务是否在cacheableOperations列表中,NX启动时构建项目图的环节都会尝试写入该缓存——你之前设置的skipNxCache和cacheableOperations只控制任务执行结果的缓存,对项目图缓存完全无效。

解决方案

针对NX 16.3.0版本,提供以下几种可行的处理方式:

1. 重定向NX缓存到可写路径

在nx.json中配置cacheDirectory,将缓存目录指向容器内默认可写的临时路径(比如/tmp/nx-cache),避开只读的/app/node_modules/.cache:

{
  "cacheDirectory": "/tmp/nx-cache"
}

2. 直接禁用项目图缓存

有两种实现方式:

  • 环境变量控制:启动容器时添加环境变量NX_CACHE_PROJECT_GRAPH=false,例如Docker启动命令:
    docker run -e NX_CACHE_PROJECT_GRAPH=false --read-only your-image-name
    
  • 配置文件设置:在nx.json的tasksRunnerOptions中添加cacheProjectGraph: false:
    {
      "tasksRunnerOptions": {
        "default": {
          "options": {
            "cacheableOperations": ["build", "lint", "test", "e2e"],
            "cacheProjectGraph": false
          }
        }
      }
    }
    

3. 禁用NX Daemon进程

NX Daemon会后台维护项目图缓存,也可能触发写入操作。可以通过两种方式禁用:

  • 启动命令加参数:nx serve --no-daemon
  • 配置文件设置:在nx.json中添加:
    {
      "tasksRunnerOptions": {
        "default": {
          "options": {
            "useDaemonProcess": false
          }
        }
      }
    }
    

4. Docker挂载临时卷

如果不想修改NX配置,可在运行容器时将/app/node_modules/.cache挂载为临时卷,使其变为可写:

docker run -v /tmp/nx-cache:/app/node_modules/.cache --read-only your-image-name

内容的提问来源于stack exchange,提问作者Adolfo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:47:42