2

Ich habe einige Umgebungsvariablen, die ich sowohl in docker-compose Konfigurationen und Dockerfile verwenden möchte. Ich habe eine Umgebungsdatei namens .env, um sie in docker-compose Datei zu verwenden (eine Lösung, die ich für this issue verwendet habe); aber diese Umgebungsvariablen sind in Dockerfile des Knotens nicht erreichbar. Betrachten Sie JMX_PORT, WS_PORT und IP als Variablen, die in meiner .env Datei definiert sind; Ich habe eine echo für jeden von ihnen in meinem Dockerfile, um zu überprüfen, ob sie an sie weitergegeben werden oder nicht.docker-komponieren verwenden Umgebungsvariablen von .env-Datei

Ich versuchte .env im env_file Abschnitt des Knotens zu setzen:

version: "2" 
services: 
    mynode: 
    build: 
     context: . 
     dockerfile: Dockerfile-mynode 
    env_file: 
     - .env 
    ports: 
     - "${JMX_PORT}:${JMX_PORT}" 
     - "${WS_PORT}:${WS_PORT}" 

ich auch versucht:

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}" 

Und mit einer wenig Änderung:

version: "2" 
services: 
    mynode: 
    build: 
     context: . 
     dockerfile: Dockerfile-mynode 
    environment: 
     - IP 
     - JMX_PORT 
     - WS_PORT 
    ports: 
     - "${JMX_PORT}:${JMX_PORT}" 
     - "${WS_PORT}:${WS_PORT}" 

Keines Die obigen Ansätze haben funktioniert.

Ich möchte sie nicht in einer anderen Datei neu definieren. Gibt es dafür eine Lösung?

EDIT 1:

Das ist mein Dockerfile:

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

EDIT 2:

Dies ist die Ausgabe von docker-compose config Befehl, der die docker-compose Zugriff auf die Umwelt hat, impliziert Variablen wie erwartet:

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: {} 

Und das ist der Ausgang des docker-compose build --no-cache Befehl, der die Dockerfile impliziert keinen Zugriff auf die Umgebungsvariablen wie erwartet:

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

Post Dockerfile auch –

+0

@TarunLalwani ist, ich meine Frage bearbeitet haben. Bitte überprüfen Sie noch einmal. –

Antwort

1

Also, was Sie tun, ist falsch. Der Grund dafür ist eine Umgebungsvariable, die beim Erstellen an Dockerfile übergeben wird. So gibt es zwei mögliche Lösungen

Verwenden Builder Argumente

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

Und dann diese Argumente zusammenstellen mit bauen passieren

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}" 

Sie können auch mithilfe von Umgebungsvariablen environment_file laden. Jetzt ist dies nur verfügbar, wenn der Container gestartet wird und sie nicht auf Ihre Compose-Datei oder Ihre Build-Datei angewendet werden.

Das Hinzufügen der Buildargumente wird nur während des Builds und nicht während des Containerstarts verfügbar gemacht.Wenn Sie tun, dass Sie die Variable definieren müssen zweimal

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 

die Umgebungsdatei kopieren

.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 

In der RUN cat /tmp/.env > /etc/profile.d/tarun.sh && chmod +x /etc/profile.d/tarun.sh erstellen wir eine Profildatei, die geladen werden soll, wenn eine Shell mit Profil ausgeführt wird.

In SHELL ["sh","-lc"] ändern wir Standard-Shell von sh -c zu sh -l, so dass es unser Profil auch laden kann.

Ausgang der letzten Stufe ist

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 

Wie Sie die Umgebungsvariable gibt es zu sehen.

Hinweis: Dieses .env Format kann nicht in docker-compose geladen werden, da wir eine Export Anweisung haben, die ein Bash-Befehl

+0

Danke. Ich habe es vorgezogen, den ersten Ansatz zu verwenden, und es hat das Problem gelöst. –

Verwandte Themen