如何比较变量并在 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---------"
输出为
- 匹配的开发者
- 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
之前从未编写过任何 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---------"
输出为
- 匹配的开发者
- 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