如何比较变量并在alpine linux中设置值

问题描述 投票:0回答:1

从来没有写过任何shell脚本,但是在广泛地搜索之后,我为我的docker文件想出了以下代码。但是不明白为什么它不起作用。

###stage 2####################
FROM nginx:alpine

##########Calculate the environment type #########
ARG BUILD_TYPE

####echo of build build_type does gives me output of Development when passed argument is Development.
RUN if [ "$BUILD_TYPE" = "Development" ]; then BUILD_TYPE='dev'; fi
RUN if [ "$BUILD_TYPE" = "Production" ]; then BUILD_TYPE='prod'; fi
RUN echo "UI BUILD_TYPE=$BUILD_TYPE---------"
##########Calculate the environment type #########

上面的回声总是作为开发来的。

更新

现在,我在单独的docker文件中构建了一个示例,以隔离问题。此后,我意识到尽管条件匹配,但分配并未发生。

这是新的示例docker文件代码。

FROM nginx:alpine

ARG BUILD_TYPE
ARG ENV_TYPE

RUN if [ "$BUILD_TYPE" = "Development" ]; then ENV_TYPE='dev'; echo "matched dev"; fi
RUN if [ "$BUILD_TYPE" = "Production" ]; then ENV_TYPE="prod"; echo "matched prod"; fi
RUN echo "UI BUILD_TYPE=$BUILD_TYPE ENV_TYPE = $ENV_TYPE---------"

输出为

  1. 匹配的开发人员
  2. UI BUILD_TYPE =开发ENV_TYPE = ---------

我看到ENV_TYPE为空。

shell docker alpine
1个回答
0
投票

Dockerfile中的每个RUN命令在单独的shell会话中执行,因此,当您设置BUILD_TYPE时,您将为仅该会话设置环境变量,该变量将覆盖构建参数。您不会覆盖整个Docker构建的构建参数。

您可以通过将if语句更改为以下内容来看到这一点:

RUN if [ "$BUILD_TYPE" = "Development" ]; then BUILD_TYPE='dev'; fi; echo $BUILD_ENV
RUN if [ "$BUILD_TYPE" = "Production" ]; then BUILD_TYPE='prod'; fi; echo $BUILD_ENV

env var已正确设置,并在行的末尾回显,但最终回显仍将返回build参数。

如果您改为将这些语句放在shell脚本中并运行它,则可以正常工作:

build.sh:

####echo of build build_type does gives me output of Development when passed argument is Development.
if [ "$BUILD_TYPE" = "Development" ]; then BUILD_TYPE='dev'; fi
if [ "$BUILD_TYPE" = "Production" ]; then BUILD_TYPE='prod'; fi
echo "UI BUILD_TYPE=$BUILD_TYPE---------"
##########Calculate the environment type #########

Dockerfile:

###stage 2####################
FROM nginx:alpine

##########Calculate the environment type #########
ARG BUILD_TYPE

COPY build.sh .
RUN ./build.sh

输出:

docker build --build-arg BUILD_TYPE=Production .

Sending build context to Docker daemon  166.9kB
Step 1/4 : FROM nginx:alpine
 ---> 36189e6707f4
Step 2/4 : ARG BUILD_TYPE
 ---> Running in cab2e8749e7e
Removing intermediate container cab2e8749e7e
 ---> ea9ec7779909
Step 3/4 : COPY build.sh .
 ---> 336989bf6389
Step 4/4 : RUN ./build.sh
 ---> Running in ecd09ee58780
UI BUILD_TYPE=prod---------
Removing intermediate container ecd09ee58780
 ---> ed9ca30af483
Successfully built ed9ca30af483
© www.soinside.com 2019 - 2024. All rights reserved.