Docker基于if-else设置ENV

时间:2018-12-13 23:02:18

标签: docker dockerfile

我遇到需要根据运行时条件设置ENV的情况,例如:

RUN if [ "$RUNTIME" = "prod" ] then VARIABLE="Some Production URL"; else VARIABLE="Some QA URL"; fi;
ENV={VARIABLE}

曾经看过不同的解决方案,但是似乎没有一个解决方案(例如,当RUN退出时,VARIABLE丢失的基本解决方案)。达到此目的的一种优雅方法是什么?

3 个答案:

答案 0 :(得分:1)

不幸的是,您只有这个“ dev / qa / prod”环境变量。但是,可以实现您想要的。

首先,您可以考虑将针对特定环境的配置烘焙到所有环境的映像中。 (Normally I would discourage to do this!) 例如,您可以将三个文件COPY dev-env.sh

  • ELASTICSEARCH_URL=http://elastic-dev:123:包含以下形式的开发配置: qa-env.sh
  • prod-env.sh(相似)
  • ENTRYPOINT(相似)

然后在运行环境(而不是构建时)中评估您所处的环境:在图像中添加一个ENVIRONMENT_NAME脚本,它将根据ENTRYPOINT ["docker-entrypoint.sh"] 来获取正确的文件。变量。

Dockerfile(部分):

WORKDIR

docker-entrypoint.sh(复制到图像的#!/bin/bash set -e if [ "$ENVIRONMENT_NAME" = "prod" ]; then source prod-env.sh fi # else if qa ... , else if dev ..., else fail exec "$@" 中):

       data("Grunfeld", package ="Ecdat") 
       grun.fe <- plm(inv ~ value + capital, data = Grunfeld, model= "within")

此脚本将在您启动Docker容器时运行,因此,如果您需要变量在Dockerfile指令中可用(在构建时),则此方法对您而言是不可行的。

here中介绍了另一种(构建时)解决方法,其中包括使用临时文件跨多个图像层存储环境变量。

答案 1 :(得分:0)

您是否需要将docker run传递给env var吗?像这样:

docker run -e YOUR_VARIABLE="Some Production URL" ...

答案 2 :(得分:0)

可以通过多阶段构建和ONBUILD实现字面条件执行。

ARG mode=prod

FROM alpine as img_prod
ONBUILD ENV ELASTICSEARH_URL=whatever/for/prod

FROM alpine as img_qa
ONBUILD ENV ELASTICSEARH_URL=whatever/for/qa

FROM img_${mode}
...

然后您使用docker build --build-arg mode=qa .

进行构建
相关问题