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

问题描述:

我有一些环境变量,我想在docker-compose配置和Dockerfile中使用。我有一个名为.env的环境文件,以便在docker-compose文件(我用于this issue的解决方案)中使用它们;但是这些环境变量在节点的Dockerfile中无法访问。考虑将JMX_PORT,WS_PORTIP作为在我的.env文件中定义的变量;我在我的Dockerfile中为它们中的每个人都放了一个echo,以检查它们是否被传递给它。docker-compose使用来自.env文件的环境变量

我试图把.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}" 

的无上述方法奏效。

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

EDIT 1:

这是我的Dockerfile

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

编辑2:

这是docker-compose config命令的,这意味着所述docker-compose访问到环境中的输出如预期的变量:

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: {} 

这是docker-compose build --no-cache命令,它意味着Dockerfile没有按预期访问的环境变量的输出:

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 
+0

安置自己的Dockerfile也 –

+0

@TarunLalwani,我已经编辑我的问题。请再次查看。 –

所以,你在做什么是错的。原因是在构建时将环境变量传递给Dockerfile。因此,有两种可能的解决

使用生成器参数

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

然后通过这些使用合成

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加载环境变量构建参数。现在只有当容器启动时才可用,它们不适用于您的撰写文件或构建文件。

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

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中,我们创建了配置文件,该配置文件在配置文件执行shell时应该加载。

SHELL ["sh","-lc"]我们将默认外壳从sh -c更改为sh -l,因此它也可以加载我们的配置文件。

最后一步的输出是

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 

正如你所看到的环境变量是存在的。

注意:此.env格式无法在docker-compose加载,因为我们有一个出口语句是bash命令

+0

谢谢。我首选使用第一种方法,并解决了这个问题。 –