docker ubuntu 中的 nodejs 找不到模块 /usr/src/app/index.js

nodejs in docker ubuntu cannot find module /usr/src/app/index.js

我正在尝试将我编写的应用程序部署到我的 unraid 服务器,所以我不得不 docker-ize 它。它是用 nodejs 编写的,依赖于 imagemagick 和 ghostscript,所以我必须包含一个构建步骤来安装这些依赖项。虽然 运行 这张图片

我看到了一个错误

这是我的docker文件

FROM node
RUN mkdir -p /usr/src/app
RUN chmod -R 777 /usr/src/app
WORKDIR /usr/src/app
COPY . /usr/src/app
RUN npm i --only=production
FROM ubuntu
RUN apt-get update
RUN apt-get install -y imagemagick ghostscript nodejs
ENTRYPOINT node /usr/src/app/index.js

控制台输出

internal/modules/cjs/loader.js:638
throw err;
^

Error: Cannot find module '/usr/src/app/index.js'

at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
at Function.Module._load (internal/modules/cjs/loader.js:562:25)
at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
at startup (internal/bootstrap/node.js:283:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)

最初,我的入口点配置为 ENTRYPOINT node ./index.js,但我以为我在错误的目录或其他地方,但切换到绝对路径也不起作用,所以我在这里。

通过使用第二条 FROM 指令,您将引入第二阶段。默认情况下,第一阶段的任何内容都不可用于第二阶段。如果你需要一些人工制品,你需要明确地复制它们。

# give the stage a name to 
# be able to reference it later
FROM node as builder
RUN mkdir -p /usr/src/app
RUN chmod -R 777 /usr/src/app
WORKDIR /usr/src/app
COPY . /usr/src/app
RUN npm i --only=production

# this is a new stage
FROM ubuntu
RUN apt-get update
RUN apt-get install -y imagemagick ghostscript nodejs
# you need to copy the things you need 
COPY --from=builder /usr/src/app /usr/src/app
ENTRYPOINT node /usr/src/app/index.js

也就是说,节点应用程序这样做似乎毫无意义。我建议使用一个阶段。 运行 您的应用需要节点 运行 时间。如果您要使用节点通过 webpack 之类的东西构建静态,然后将生成的静态复制到不需要节点的第二阶段 运行time.

,那么多阶段将是有意义的

另请注意,仅当您的应用程序需要额外的参数和标志时,在简单命令上使用入口点才有意义,并且您希望图像的用户能够提供所述参数而无需知道如何开始实际的应用程序。

另一件需要改进的事情是使用 npm ci 而不是 npm i 来避免生产中未经测试的行为。

使用 2 运行 指令创建文件夹并更改其权限似乎也有些多余。如果您使用工作目录,则会自动创建该文件夹。