【问题标题】:nodejs in docker ubuntu cannot find module /usr/src/app/index.jsdocker ubuntu 中的 nodejs 找不到模块 /usr/src/app/index.js
【发布时间】:2022-02-04 09:41:13
【问题描述】:

我正在尝试将我编写的应用程序部署到我的 unraid 服务器上,因此我不得不对其进行 docker 化。它是用 nodejs 编写的,并且依赖于 imagemagick 和 ghostscript,所以我必须包含一个构建步骤来安装这些依赖项。我在运行此图像时看到了一个错误

这是我的 dockerfile

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,但我认为我在错误的目录中,但切换到绝对路径也不起作用,所以我在这里。

【问题讨论】:

    标签: node.js docker dockerfile


    【解决方案1】:

    通过使用第二条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
    

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

    另请注意,仅当您的应用程序需要额外的参数和标志并且您希望图像的用户能够提供所述参数而不需要知道如何启动实际应用程序。

    另一个需要改进的地方是使用npm ci 而不是npm i 以避免生产中未经测试的行为。

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

    【讨论】:

    • 在 ubuntu 构建步骤上安装 npm 似乎需要从命令行输入,尽管在 apt-get install 步骤上启用了 -y 选项这是我当前的 dockerfile,其中进行了更改 dockerfile FROM node as builder WORKDIR /usr/src/app COPY . /usr/src/app RUN npm ci --only=production FROM ubuntu RUN apt-get update RUN apt-get install -y imagemagick ghostscript nodejs COPY --from=builder /usr/src/app /usr/src/app ENTRYPOINT node index.js
    • 哦,这很难读,抱歉
    • @BrandonPina,最好为此提出一个新问题。我猜你必须了解如何以所谓的 headless 模式安装你的包。也就是说,当它由一些没有人提供输入的自动化完成时。这取决于您要安装的内容。
    猜你喜欢
    • 2021-08-07
    • 2019-08-08
    • 1970-01-01
    • 2017-11-27
    • 2023-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    相关资源
    最近更新 更多