我遇到需要根据运行时条件设置ENV的情况,例如:
RUN if [ "$RUNTIME" = "prod" ] then VARIABLE="Some Production URL"; else VARIABLE="Some QA URL"; fi;
ENV={VARIABLE}
曾经看过不同的解决方案,但是似乎没有一个解决方案(例如,当RUN退出时,VARIABLE丢失的基本解决方案)。达到此目的的一种优雅方法是什么?
答案 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 .