我正在为一个ruby应用程序构建一个容器。我的应用程序的配置包含在环境变量中(在应用程序中加载dotenv)。
其中一个配置变量是应用程序的公共ip,它在内部用于创建链接。
我需要添加一个dnsmasq条目,将这个ip指向容器内的127.0.0.1,这样它就可以获取应用程序的链接,就好像它没有容器化一样。
因此,我试图在我的Dockerfile中设置一个ENV,它将传递一个环境变量给容器。
我尝试了一些方法。
ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`
所有内容都传递“REQUEST_DOMAIN”字符串,而不是环境变量的值。
是否有一种方法将环境变量值从主机传递到容器?
当使用build-arg时…
docker build——build-arg CODE_VERSION=1.2 Dockerfile
...考虑变量在FROM之后不可用:
ARG CODE_VERSION=latest
FROM base:${CODE_VERSION}
在FROM之前声明的ARG在构建阶段之外,因此它不能在FROM之后的任何指令中使用。
通常arg应该放在FROM之后,如果FROM期间不需要的话:
FROM base:xy
ARG ABC=123
要使用在第一个FROM之前声明的ARG的默认值,请使用在构建阶段中不带值的ARG指令:
ARG VERSION=latest
FROM busybox:$VERSION
ARG VERSION
RUN echo $VERSION > image_version
https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact
你应该在Dockerfile中使用ARG指令,这是为了达到这个目的。
ARG指令定义了一个变量,用户可以在构建时使用docker构建命令——build- ARG <varname>=<value>标志将该变量传递给构建器。
所以你的Dockerfile会有这一行:
ARG request_domain
或者如果您更喜欢默认值:
ARG request_domain=127.0.0.1
现在你可以在Dockerfile中引用这个变量:
ENV request_domain=$request_domain
然后你将像这样构建你的容器:
$ docker build --build-arg request_domain=mydomain Dockerfile
注1:如果你在Dockerfile中引用了一个ARG,但在——build- ARG中排除了它,那么你的映像将无法构建。
注2:如果用户指定的构建参数在Dockerfile中没有定义,构建会输出一个警告:
[警告]一个或多个build-args [foo]未被消耗