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

标签 docker environment-variables docker-compose dockerfile environment

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

我试着把 .envenv_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}

编辑 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。所以有两种可能的解决方案

使用构建器参数

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 加载环境变量.现在这仅在容器启动时可用,并且它们不适用于您的撰写文件或构建文件。

此外,添加构建参数只会在构建期间而不是在容器启动期间使它们可用。如果你需要这样做,你需要定义变量两次
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 更改默认 shell至 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

如您所见,环境变量就在那里。

Note: This .env format cannot be loaded in docker-compose as we have an export statement which is a bash command

关于docker-compose 使用 .env 文件中的环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46021659/

相关文章:

ruby - 使用Serverspec进行空的gem缓存检查失败,以进行Docker镜像构建测试

docker - Dockerfile 中现有文件的 COPY 神秘失败

python - 优雅地停止 ecs 容器

c# - 如何在 vscode 中访问 tasks.json 中的 .env 变量?

postgresql - Docker 卷数据不会保存到 mac 中的主机文件夹

带有本地服务器的 Docker/Kubernetes

struct - Elixir:将 sys.config 的结构转换为 erlang

交响乐 4 : Uncaught RuntimeException: APP_ENV environment variable is not defined

windows - 无法在 Windows 上将持久文件夹添加到 bitnami/mongodb

docker - 如何在 docker compose 中声明 docker 卷存在于外部硬盘驱动器上