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

基于dimfacion/curaengine构建Node.js应用Docker镜像运行报错

问题描述

我正尝试将使用dimfacion/curaengine镜像的Node.js应用容器化,希望构建一个整合两者的单一镜像,但运行该镜像时出现错误。

index.js 代码

const express = require('express');
const { exec } = require('child_process');
const multer = require('multer');

const app = express();
const port = 3000;


const storage = multer.diskStorage({
  destination: 'uploads/',
  filename: (req, file, cb) => {
    const originalFilename = file.originalname;
    cb(null, originalFilename);
  },
});

const upload = multer({ storage });

app.post('/slice', upload.single('stlFile'), (req, res) => {
  let stlFile = req.file.path;
  stlFile = stlFile.replace(/\\/g, '/');

  const command = `docker run -v ${__dirname}/uploads:/uploads dimfacion/curaengine slice -v -j /usr/src/Cura/resources/definitions/fdmprinter.def.json -l /uploads/${req.file.filename} 2>&1`;

  exec(command, (error, stdout, stderr) => {
    if (error) {
      console.error(`Error: ${error.message}`);
      return res.status(500).send('Internal Server Error');
    }

    return res.send(stdout)
});

app.listen(port, () => {
  console.log(`App running on port ${port}`);
});

Dockerfile 内容

FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

FROM dimfacion/curaengine
WORKDIR /app
COPY --from=builder /app .
WORKDIR /app
CMD ["node", "index.js"]

运行错误信息

[ERROR] Unknown command: node
[ERROR] Command called:
[ERROR] /usr/src/CuraEngine/build/CuraEngine [ERROR] node [ERROR] index.js [ERROR]

问题原因及解决方法

核心原因

dimfacion/curaengine镜像的基础环境中没有安装Node.js,且该镜像默认的ENTRYPOINT被设置为CuraEngine的执行文件。当你指定CMD ["node", "index.js"]时,实际是把node index.js作为参数传递给了CuraEngine,导致出现"Unknown command: node"的错误。

解决方法

方法1:基于Node.js镜像构建(推荐)

放弃使用dimfacion/curaengine作为基础镜像,转而从Node.js镜像出发,手动安装CuraEngine依赖并编译,确保镜像同时包含Node.js和CuraEngine。

修改后的Dockerfile:

FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 构建包含CuraEngine的Node镜像
FROM node:14
WORKDIR /app
# 安装CuraEngine编译依赖
RUN apt-get update && apt-get install -y \
    git \
    cmake \
    build-essential \
    libboost-all-dev \
    libpng-dev \
    libzip-dev \
    && rm -rf /var/lib/apt/lists/*

# 克隆并编译CuraEngine
RUN git clone https://github.com/Ultimaker/CuraEngine.git /usr/src/CuraEngine \
    && cd /usr/src/CuraEngine \
    && mkdir build \
    && cd build \
    && cmake .. \
    && make

# 复制Node应用文件
COPY --from=builder /app .
# 创建uploads目录避免上传报错
RUN mkdir -p uploads

CMD ["node", "index.js"]

同时修改index.js中的命令,直接调用本地CuraEngine,无需再通过docker run:

const command = `/usr/src/CuraEngine/build/CuraEngine slice -v -j /usr/src/CuraEngine/resources/definitions/fdmprinter.def.json -l ${stlFile} 2>&1`;

方法2:在dimfacion/curaengine镜像中安装Node.js并覆盖ENTRYPOINT

如果坚持使用dimfacion/curaengine作为基础镜像,需要先安装Node.js,再覆盖镜像默认的ENTRYPOINT,让容器启动时执行Node命令。

修改后的Dockerfile:

FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

FROM dimfacion/curaengine
WORKDIR /app
# 安装Node.js(适配Debian/Ubuntu系基础镜像)
RUN apt-get update && apt-get install -y nodejs npm && rm -rf /var/lib/apt/lists/*
# 复制Node应用文件
COPY --from=builder /app .
# 创建uploads目录
RUN mkdir -p uploads
# 覆盖ENTRYPOINT,让容器启动时执行node命令
ENTRYPOINT []
CMD ["node", "index.js"]

同样需要修改index.js中的命令,直接调用本地CuraEngine:

const command = `/usr/src/CuraEngine/build/CuraEngine slice -v -j /usr/src/Cura/resources/definitions/fdmprinter.def.json -l ${stlFile} 2>&1`;

额外注意事项

  • 务必确保容器内存在uploads目录,否则multer上传文件会触发报错。
  • 注意CuraEngine配置文件的路径,不同编译方式可能导致路径差异,需根据实际情况调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:25:40