docker-compose使用来自.env文件的环境variables
我有一些环境variables,我想在Dockerfile
docker-compose
configuration和Dockerfile
。 我有一个名为.env
的环境文件,以便在.env
docker-compose
文件(我用于这个问题的解决scheme)中使用它们; 但是这些环境variables在节点的Dockerfile
是不可访问的。 考虑JMX_PORT
, WS_PORT
和IP
作为我的.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命令