我的应用程序具有功能标志,我想为我的npm build
动态设置为 true。 本质上我想做类似的事情COMPILE_ASSETS=true npm build
或NEW_EMAILS=true npm build
,仅从CI动态。
我有一个 CI 管道可以抓取标志,但在 Dockerfile 中将其设置为 true 并运行 npm 时遇到问题。
我的 Dockerfile -
FROM ubuntu:bionic
ARG FEATURE_FLAG
RUN if [ "x$FEATURE_FLAG" = "x" ] ;
then npm run build ;
else $FEATURE_FLAG=true npm run build;
fi
这运行起来——
docker build --no-cache --rm -t testing --build-arg FEATURE_FLAG=my_feature_flag .
(我想保持原样(
在CI中,我得到
/bin/sh: 1: my_feature_flag=true: not found
我尝试了各种形式的 else 语句——
else export $FEATURE_FLAG=true npm run build;
(这实际上看起来可以在我的 Mac 上运行,但在 CI 中失败export: : bad variable name
else ${FEATURE_FLAG:+$FEATURE_FLAG=true} npm build;
else eval(`$FEATURE_FLAG=true npm build`);
'else env $FEATURE_FLAG=true bash -c 'npm build';
这些都失败了:(
我尝试完全重新设计 Dockerfile 并将标志设置为 true 作为 ENV -
ARG FEATURE_FLAG
ENV FF_SET_TRUE=${FEATURE_FLAG:+$FEATURE_FLAG=true}
ENV FF_SET_TRUE=${FF_SET_TRUE:-null}
RUN if [ "$FF_SET_TRUE" = "null" ] ;
then npm build;
else $FF_SET_TRUE npm build;
fi
什么都行不通! 这仅仅是一个 bash 限制吗? 在运行命令之前扩展变量是不可能的吗?
或者这在 Docker 中是不可能的吗?
你的意思是:
FROM ubuntu:bionic
ARG FEATURE_FLAG
RUN set -eux;
if [ "x$FEATURE_FLAG" == "x" ] ; then
npm run build ;
else
eval $($FEATURE_FLAG=true npm run build);
fi
您需要将命令包装在 eval 中,以便变量根据传递的 ARGS 进行扩展。
这奏效了!
ARG FEATURE_FLAG
RUN if [ -z "$FEATURE_FLAG" ] ;
then npm run build ;
else
echo setting $FEATURE_FLAG to true;
env "$FEATURE_FLAG"=true sh -c 'npm run build';
fi