2

我有一些環境變量,我想在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,我已經編輯我的問題。請再次查看。 –

回答

1

所以,你在做什麼是錯的。原因是在構建時將環境變量傳遞給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

謝謝。我首選使用第一種方法,並解決了這個問題。 –