【问题标题】:Docker CMD cant not read argument in node applicationDocker CMD 无法读取节点应用程序中的参数
【发布时间】:2022-01-20 03:43:24
【问题描述】:

这是我的构建命令

docker build --build-arg APP_PROJ=proj1 --build-arg APP_ENV=dev -t proj1 .

给出两个参数,APP_ENVAPP_PROJ。这是我的 Dockerfile 内容

FROM node:14.15 AS build

ARG APP_ENV
ARG APP_PROJ

WORKDIR /usr/src/app

COPY package.json package-lock.json ./

RUN npm cache clean --force
RUN npm i

COPY . .

RUN npm run build:${APP_PROJ}:${APP_ENV}

CMD [ "node", "dist/${APP_PROJ}/server/main.js" ]

我想添加一个参数来证明正在构建哪个项目,但是当我运行 docker image 时,它​​返回了一个错误

Error: Cannot find module '/usr/src/app/dist/${APP_PROJ}/server/main.js'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)

at Function.Module._load (internal/modules/cjs/loader.js:725:27)

at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)

at internal/main/run_main_module.js:17:47{
 code: 'MODULE_NOT_FOUND',
 requireStack: []
}
  • 我已经检查了我的 dist 是否存在 main.js

看来 dockerFile 无法读取环境变量 APP_PROJ。如何传递参数让 docker 读取正确的 main.js?

感谢帮助~

【问题讨论】:

    标签: angular docker dockerfile


    【解决方案1】:

    您似乎混淆了“ARGuments”和“ENVironments”。

    这个doc 正在帮助理解差异。主要是这样的:

    ARG 仅在构建 Docker 映像(RUN 等)期间可用, 不是在创建映像并从中启动容器之后 (入口点,CMD)

    因此,您必须使用 ENV 变量来设置它们,以便您的 CMD 了解它们....
    实际上,您可以在此documentation(同一网站)之后在构建时从 ARG 设置 ENV。这是常见(不直观)的方式。

    另一种方法是将它们硬编码到 Dockerfile 中(您可以在构建之前使用“sed”命令来根据您的项目设置您的 DOckerfile)

    另外:这可能不起作用,因为当您使用 CMD 作为参数列表时不使用变量替换。您可能必须切换到原始 CMD (CMD dosomething "$myvar ${anotherVar}") 或使用外壳形式的 CMD (CMD dosomething $myvar ${anotherVar})

    【讨论】:

    • 你拯救了我的一天!!正如你所说,原始 CMD 无法识别 ENV。我将其修复为原始状态。终于成功了!!
    猜你喜欢
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 2019-07-27
    • 2021-09-22
    • 1970-01-01
    相关资源
    最近更新 更多