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

在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 };
    }),

额外验证点

  1. 确认目标仓库的.dockerignore文件没有排除package*.json或项目根目录内容(手动构建已成功,此问题概率极低)。
  2. 再次确认context路径确实指向包含Dockerfile和package.json的目标仓库目录(你已打印路径验证,此步骤可跳过)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:27:28