2017-11-07 9 views
0

Ich bin verwirrt, weil es scheint, dass eine Umgebungsvariable, die in Docker-compose.yml gesetzt Docker verursacht mein Bild auf den Wiederaufbau Docker-komponieren up:Mit env Variablen von Docker komponiert in einem Dockerfile

Dockerfile für apache_php_with_custom_docroot

FROM php:7.1.11-apache-jessie 

# Set apache document root 
ENV APACHE_DOCUMENT_ROOT /var/www/web 
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf 
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf 

ich baue es mit docker build -t apache_php_with_custom_docroot .

docker-compose.yml

version: "3" 
services: 
    web:  
    image: apache_php_with_custom_docroot 
    environment: 
     - APACHE_DOCUMENT_ROOT=/var/www/anotherfolder 

So ist das Merkwürdige für mich: Es funktioniert, um den APACHE_DOCUMENT_ROOT zu setzen. Wenn ich rufe docker-compose up -d Apache verwendet das Docroot /var/www/anotherfolder.

Ich war mir sicher, als mein Image erstellt wurde, kann ich es in meiner Docker-Compose-Datei nicht ändern. Ich lese etwas über build Parameter z.B. hier: Docker-compose: Set a variable in env file and use it in Dockerfile

Aber ich habe keine Build-Parameter gesetzt. Woher weiß Docker, dass er mein Image wiederherstellen muss? Wo kann ich über die Prinzipien dahinter lesen?

+0

ein bisschen rostig mit Docker! Soweit ich weiß, ist jede Änderung in docker-compose.yml notwendig, um ein up zu machen (weil docker es liest und das virtuelle Dateisystem und das Container-Verhalten erstellt), also muss ich sie an den entrepoint anhängen, wo Sie können zB eine Datei mit vars lesen und jedes Mal laden, wenn Container gestartet wird ... –

Antwort

-1

definieren einen Einstiegspunkt in Ihrem dockerfile wie:

ENTRYPOINT bash $APACHE_DOCUMENT_ROOT/entrypoint.sh 

Und dann jedes Mal Container in Ihrem Eintrittspunkt beginnen, werden Sie kartiert Volumen mit einer Datei lesen können und in Ihrem Behälter zu injizieren oder erklären die Umgebungen oder damit verbundene Start Aufgabe, die Sie

enviroment=$(cat /mapped_config/enviroment.env) 
if grep -Fxq "$enviroment" /home/.bashrc 
    then 
     echo "Environment setted propertly" 
    else 
     echo "$enviroment" >> /home/.bashrc 
     echo "enviorment setted!" 
fi 

es ist nur eine Idee, und wahrscheinlich nicht die beste Art und Weise benötigen, ist, wie ich es in Vergangenheit beschäftigen.

+0

-1, weil dies keine Antwort auf meine Frage ist. Ich verstehe nicht, warum mein Code funktioniert, ich habe nicht nach einer Antwort gesucht, wie dies auf eine andere Art und Weise gemacht werden könnte ... – user1383029

+0

ich versuche nur zu erklären, wenn du docker-compose up, docker liest dein docker-compose.yml file und bilde dein image (mit config und vars du definierst), nachdem du docker-compose-datei (wie zB env var etc ..) verändert hast musst du neu bauen (nicht stoppen, starten oder neustarten) Wenn Sie etwas dynamisch lesen möchten, wenn Container gestartet werden, können Sie diese Mitarbeiter im Einstiegspunkt erledigen –

Verwandte Themen