docker-compose使用来自.env文件的环境variables

我有一些环境variables,我想在Dockerfile docker-composeconfiguration和Dockerfile 。 我有一个名为.env的环境文件,以便在.env docker-compose文件(我用于这个问题的解决scheme)中使用它们; 但是这些环境variables在节点的Dockerfile是不可访问的。 考虑JMX_PORTWS_PORTIP作为我的.env文件中定义的variables; 我在我的Dockerfile为它们中的每一个添加了一个echo ,以检查它们是否被传递给它。

我试图把.env放在节点的env_file部分:

 version: "2" services: mynode: build: context: . dockerfile: Dockerfile-mynode env_file: - .env ports: - "${JMX_PORT}:${JMX_PORT}" - "${WS_PORT}:${WS_PORT}" 

我也试过:

 version: "2" services: mynode: build: context: . dockerfile: Dockerfile-mynode environment: - IP=${IP} - JMX_PORT=${JMX_PORT} - WS_PORT=${WS_PORT} ports: - "${JMX_PORT}:${JMX_PORT}" - "${WS_PORT}:${WS_PORT}" 

而且有一点改变:

 version: "2" services: mynode: build: context: . dockerfile: Dockerfile-mynode environment: - IP - JMX_PORT - WS_PORT ports: - "${JMX_PORT}:${JMX_PORT}" - "${WS_PORT}:${WS_PORT}" 

上述方法都没有奏效。

我不想在另一个文件中重新定义它们。 有没有解决scheme?

编辑1:

这是我的Dockerfile

 FROM mybaseimage MAINTAINER Zeinab Abbasimazar RUN echo ${IP} RUN echo ${JMX_PORT} RUN echo ${WS_PORT} 

编辑2:

这是docker-compose config命令的输出,这意味着docker-compose可以正常访问环境variables:

 services: mynode: build: context: /home/zeinab/Workspace/ZiZi-Docker/Test/test-1 dockerfile: Dockerfile-WRCore environment: IP: 171.80.80.80 JMX_PORT: '1998' WS_PORT: '9000' ports: - 1998:1998 - 9000:9000 version: '2.0' volumes: {} 

这是Dockerfile docker-compose build --no-cache命令的输出,这意味着Dockerfile无法正常访问环境variables:

 docker-compose build --no-cache Building mynode Step 1 : FROM mybaseimage ---> 875978d91e2e Step 2 : MAINTAINER Zeinab Abbasimazar ---> Running in 250eac87d078 ---> 0e7bd6a18c80 Removing intermediate container 250eac87d078 Step 3 : RUN echo ${IP} ---> Running in 4ee6dbf74b2a ---> fd2bff1de6b6 Removing intermediate container 4ee6dbf74b2a Step 4 : RUN echo ${JMX_PORT} ---> Running in 01245df43926 ---> 68b7e90b1c01 Removing intermediate container 01245df43926 Step 5 : RUN echo ${WS_PORT} ---> Running in d27db926ecac ---> a8c3d0cbade8 Removing intermediate container d27db926ecac Successfully built a8c3d0cbade8 

所以你在做什么是错的。 存在的原因是在构build时将环境variables传递给Dockerfile。 所以有两种可能的解决scheme

使用生成器参数

 FROM mybaseimage MAINTAINER Zeinab Abbasimazar ARG IP ARG JMX_PORT ARG WS_PORT RUN echo ${IP} RUN echo ${JMX_PORT} RUN echo ${WS_PORT} 

然后使用compose传递这些构build参数

 version: "2" services: mynode: build: context: . dockerfile: Dockerfile-mynode args: - IP=${IP} - JMX_PORT=${JMX_PORT} - WS_PORT=${WS_PORT} environment_file: - .env ports: - "${JMX_PORT}:${JMX_PORT}" - "${WS_PORT}:${WS_PORT}" 

你也可以使用environment_file加载环境variables。 现在只有在容器启动时才可用,它们不适用于您的撰写文件或构build文件。

同时添加构build参数只会使它们在构build期间而不是在容器启动期间可用。 如果你需要这样做,你需要定义variables两次

 FROM mybaseimage MAINTAINER Zeinab Abbasimazar ARG IP ARG JMX_PORT ARG WS_PORT ENV IP=${IP} JMX_PORT=${JMX_PORT} WS_PORT=${WS_PORT} RUN env 

复制环境文件

.ENV

 export NAME=TARUN 

Dockerfile

 FROM alpine COPY .env /tmp/.env RUN cat /tmp/.env > /etc/profile.d/tarun.sh && chmod +x /etc/profile.d/tarun.sh SHELL ["sh","-lc"] RUN env 

RUN cat /tmp/.env > /etc/profile.d/tarun.sh && chmod +x /etc/profile.d/tarun.sh我们创build了configuration文件,在configuration文件执行shell时应该加载该文件。

SHELL ["sh","-lc"]我们将默认shell从sh -c更改为sh -l这样它也可以加载我们的configuration文件。

最后一步的输出是

 Step 5/5 : RUN env ---> Running in 329ec287a5a6 HOSTNAME=e1ede117fb1e SHLVL=1 HOME=/root PAGER=less PS1=\h:\w\$ NAME=TARUN PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PWD=/ CHARSET=UTF-8 ---> 6ab95f46e940 

正如你所看到的,环境variables就在那里。

注意:这个.env格式不能在.env docker-compose加载,因为我们有一个导出语句,它是一个bash命令