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

How to compare a variable and set the value in alpine linux

之前从未编写过任何 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 是空的。

Dockerfile 中的每个 RUN 命令都在单独的 shell 会话中执行,因此当您设置 BUILD_TYPE 时,您正在为 设置一个环境变量session only,它会覆盖构建参数。您不会覆盖整个 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

环境变量已正确设置,并在行尾回显,但您的最终回显仍将 return 构建参数。

如果您改为将这些语句放在 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