如何在 docker 文件中将环境变量动态设置为 true



我的应用程序具有功能标志,我想为我的npm build动态设置为 true。 本质上我想做类似的事情COMPILE_ASSETS=true npm buildNEW_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

最新更新