在NextJS 14中用Dockerode构建Docker镜像遇COPY失败问题
问题解决:Dockerode构建NextJS镜像时COPY找不到package.json
问题根源
你遇到的核心问题是Dockerode的buildImage方法中src参数的使用逻辑错误。当指定src: ["Dockerfile"]时,Dockerode只会将Dockerfile单个文件打包作为构建上下文发送给Docker daemon,而你的Dockerfile需要复制package*.json和整个项目文件,这些文件不在构建上下文范围内,因此触发找不到文件的报错。
而手动执行docker build .时,默认会把当前目录(即你指定的context路径)下所有文件(.dockerignore排除的内容除外)作为构建上下文,所以能正常找到所需文件。
解决方案
移除buildImage配置中的src参数,让Dockerode默认将整个context目录作为构建上下文:
修改后的tRPC方法代码:
buildImage: userProcedure .input( z.object({ repositoryId: z.string(), }) ) .mutation(async ({ input }) => { const docker = new Docker(); const { repositoryId } = input; const imageName = repositoryId; const context = path.join( __dirname, "../../../../../../repositories", repositoryId ); console.log(context); // 移除src参数,仅保留context配置 const buildStream = await docker.buildImage( { context: context, }, { t: imageName } ); buildStream.on("data", (data) => { const buildOutput = JSON.parse(data.toString()); if (buildOutput.stream) { process.stdout.write(buildOutput.stream); // 输出构建进度 } else if (buildOutput.error) { console.error("Build Error:", buildOutput.error); // 输出错误信息 } }); // 等待构建流程结束 await finished(buildStream); // 获取并打印镜像ID const image = docker.getImage(imageName); const imageInspect = await image.inspect(); console.log(imageInspect.Id); return { imageName }; }),
额外验证点
- 确认目标仓库的
.dockerignore文件没有排除package*.json或项目根目录内容(手动构建已成功,此问题概率极低)。 - 再次确认
context路径确实指向包含Dockerfile和package.json的目标仓库目录(你已打印路径验证,此步骤可跳过)。
内容的提问来源于stack exchange,提问作者EdoPalo
相关产品推荐
相关产品推荐

