docker-compose 使用 .env 文件中的环境变量
docker-compose use environment variables from .env file
我有一些环境变量,我想在 docker-compose
配置和 Dockerfile
中使用。我有一个名为 .env
的环境文件,以便在 docker-compose
文件中使用它们(我用于 的解决方案);但是这些环境变量在节点的 Dockerfile
中是不可访问的。将 JMX_PORT
、WS_PORT
和 IP
视为在我的 .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}"
None 以上方法有效。
我不想在另一个文件中重新定义它们。有解决办法吗?
编辑 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"]
中,我们将默认 shell 从 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
如您所见,环境变量就在那里。
Note: This .env
format cannot be loaded in docker-compose
as we have an export statement which is a bash command
我有一些环境变量,我想在 docker-compose
配置和 Dockerfile
中使用。我有一个名为 .env
的环境文件,以便在 docker-compose
文件中使用它们(我用于 Dockerfile
中是不可访问的。将 JMX_PORT
、WS_PORT
和 IP
视为在我的 .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}"
None 以上方法有效。
我不想在另一个文件中重新定义它们。有解决办法吗?
编辑 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"]
中,我们将默认 shell 从 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
如您所见,环境变量就在那里。
Note: This
.env
format cannot be loaded indocker-compose
as we have an export statement which is a bash command