如何在Node.js Google Cloud Run服务中引入本地依赖
解决Cloud Run部署时本地依赖MODULE_NOT_FOUND问题
你遇到的问题核心是:Cloud Run的构建环境只会打包当前部署目录下的文件,你用../../指向的上级目录文件不会被包含到构建镜像中,导致npm安装时找不到这些本地依赖。
以下是可行的解决方案:
方案1:调整项目结构(推荐)
把本地依赖文件移到Cloud Run服务目录的子文件夹中,确保它们在部署上下文范围内:
- 在你的Cloud Run服务目录下创建
local-packages文件夹 - 将
embeddings.js、opt.js等依赖文件移动到这个子文件夹中 - 修改
package.json的依赖路径为当前目录相对路径:
"dependencies": { "express": "^4.17.1", "embeddings": "file:./local-packages/embeddings.js", "opt": "file:./local-packages/opt.js", "gpt": "file:./local-packages/gpt.js", "pinecone": "file:./local-packages/pinecone.js", "users": "file:./local-packages/users.js" }
- 在服务目录下执行
gcloud run deploy命令,此时构建上下文会包含local-packages文件夹,npm能正常找到依赖。
方案2:直接在代码中引入文件(无需package.json配置)
如果不想移动文件,可直接在代码中用相对路径引入依赖,但必须确保部署时上级目录文件被包含到构建上下文中:
- 修改代码中的
require语句为:
const embeddings = require('../../embeddings.js'); const opt = require('../../opt.js'); // 其他依赖同理
- 切换到项目根目录执行
gcloud run deploy,并指定服务目录为参数:
gcloud run deploy --source ./services/my-cloud-run-service
这种方式会把整个项目根目录作为构建上下文,确保上级目录的依赖文件被打包进镜像。
方案3:使用自定义Dockerfile
如果需要更灵活的构建控制,可编写Dockerfile明确复制依赖文件:
FROM node:18-slim WORKDIR /usr/src/app # 复制package文件和本地依赖 COPY package*.json ./ COPY ../../embeddings.js ./embeddings.js COPY ../../opt.js ./opt.js COPY ../../gpt.js ./gpt.js COPY ../../pinecone.js ./pinecone.js COPY ../../users.js ./users.js COPY index.js ./ RUN npm install CMD ["node", "index.js"]
然后在服务目录下执行部署命令:
gcloud run deploy --dockerfile Dockerfile
内容的提问来源于stack exchange,提问作者Deejpake
相关产品推荐
相关产品推荐

