我的应用程序具有一些功能标记,我希望将其npm build
动态设置为true。
本质上我想做类似的事情
COMPILE_ASSETS=true npm build
或NEW_EMAILS=true npm build
,只能从CI动态获取。
我有一个将捕获该标志的CI管道,但是在将其设置为true并在Dockerfile中运行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上正常运行,但是在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无法做到这一点?
答案 0 :(得分:0)
您的意思是:
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进行扩展。
答案 1 :(得分:0)
这有效!
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