【问题标题】:Why args passed to script through ENTRYPOINT is not received properly?为什么没有正确接收通过 ENTRYPOINT 传递给脚本的 args?
【发布时间】:2021-07-27 14:26:48
【问题描述】:

我的 node.js 项目的 startup.sh 脚本是:

#!bin/sh

echo "Starting with ENV: $ENV"
cd /app

export PORT=8080
export NODE_ENV=$ENV

node main.js $ENV

Dockerfile 看起来像:

FROM ...
LABLE ..

ARG env
ENV ENV=${env}

RUN mkdir /app

# COPY required files
COPY ...

RUN cd /app && npm install --silent
EXPOSE 8080

ENTRYPOINT ["/bin/sh", "/app/startup.sh"]

我正在使用带有命令的 Jenkins 构建图像:

docker build --build-arg ENV=test -t "tag" .

脚本未能接收到值“test”。

我尝试了什么:

  • 更新startup.sh 以使用$1(positional arg) 而不是$ENV 并通过ENTRYPOINT 传递值:

    • ENTRYPOINT ["/bin/sh", "/app/startup.sh", ${ENV}]
      这给出了错误:找不到文件或目录:/bin/sh /bin/sh,]
    • ENTRYPOINT ["/bin/sh", "/app/startup.sh", "${ENV}"]
      不给出错误,但 $1 的值为 "${ENV}"
  • 使用 ENTRYPOINT 和 CMD 的组合:

    • ENTRYPOINT ["/bin/sh", "/app/startup.sh"]CMD[${ENV}] $1 的值以“-c”的形式出现。

【问题讨论】:

  • 尝试在您的startup.sh 中将#!bin/sh 更改为#! /bin/sh
  • 脚本中的echo 行打印出来了吗?您如何访问代码中的参数? (可以使用process.env.NODE_ENVprocess.env.ENV 代替位置参数吗?)
  • @DavidMaze 是的,echo 行打印:“以 ENV 开头:”。我想过使用 process.env.ENV,但在启动时需要 env。例如:config 库需要 NODE_ENV,因此它可以加载适当的 yaml 文件(test/stage/prod)。

标签: bash docker shell dockerfile


【解决方案1】:

我想是因为ARG env的使用

ARG ENV
ENV ENV=${ENV}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2021-04-21
    • 2010-12-15
    • 1970-01-01
    • 2020-01-11
    • 2015-08-30
    • 2016-01-27
    相关资源
    最近更新 更多