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

7
我有一些环境变量,想要在docker-compose配置文件和Dockerfile中使用。我有一个名为.env的环境文件,以便在docker-compose文件中使用它们(这是我在这个问题上使用的解决方案); 但是这些环境变量在node的Dockerfile中不可用。将JMX_PORTWS_PORTIP视为在我的.env文件中定义的变量;我在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}"

以上方法都无法解决问题。

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

编辑 1:

这是我的Dockerfile

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

EDIT 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

发布你的 Dockerfile。 - Tarun Lalwani
@TarunLalwani,我已经编辑了我的问题。请再次查看一遍。 - Zeinab Abbasimazar
1个回答

6
你所做的是错误的。原因是在构建时需要传递环境变量给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}

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

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加载环境变量。现在,只有在容器启动时才可用,不适用于您的compose文件或构建文件。
另外,添加构建参数仅在构建期间可用,而非容器启动期间。如果需要这样做,则需要定义变量两次。
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 中,我们创建了一个配置文件,当使用 profile 执行 shell 时应该加载该文件。
SHELL ["sh","-lc"] 中,我们将默认 shell 从 sh -c 改为 sh -l,以便它也可以加载我们的 profile。
最后一步的输出结果是:
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 命令。


谢谢。我更喜欢使用第一种方法,它解决了问题。 - Zeinab Abbasimazar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接