如何在dockerfile中动态将环境变量设置为true

时间:2020-05-22 02:33:50

标签: docker npm dockerfile

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

  • 中无法使用CI
  • 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无法做到这一点?

2 个答案:

答案 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