【发布时间】: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_ENV或process.env.ENV代替位置参数吗?) -
@DavidMaze 是的,
echo行打印:“以 ENV 开头:”。我想过使用 process.env.ENV,但在启动时需要 env。例如:config库需要 NODE_ENV,因此它可以加载适当的 yaml 文件(test/stage/prod)。
标签: bash docker shell dockerfile