2017-09-27 1 views
1

Ich benutze Docker für die Entwicklung und in der Produktion für Laravel-Projekt. Ich habe eine etwas andere Dockerdatei für Entwicklung und Produktion. Zum Beispiel mounte ich ein lokales Verzeichnis in den Docker-Container in der Entwicklungsumgebung, so dass ich für jede Änderung im Code nicht docker build machen muss.So konfigurieren Sie verschiedene Dockerfiles für Entwicklung und Produktion

Da angehängtes Verzeichnis nur verfügbar ist, wenn der Docker-Container ausgeführt wird Ich kann keine Befehle wie "composer install" oder "npm install" in dockerfile für die Entwicklung eingeben.

Momentan verwalte ich zwei docker Dateien, gibt es eine Möglichkeit, dass ich dies mit einer einzelnen docker Datei tun kann und entscheide welche Befehle ausgeführt werden sollen, wenn docker erstellt wird, indem Parameter gesendet werden.

Was ich zu erreichen versuche, ist

In Docker Datei

... 
IF PROD THEN RUN composer install 
... 

Während Docker

docker build [PROD] -t mytag . 
+0

Es ist am besten, das gleiche zu verwenden und zu überlagern ay Ihre dev-Anforderungen an das Produktionsbild. – Matt

+0

Mögliches Duplikat von [Wie erstelle ich Docker-Images, wenn meine Entwicklungsumgebung meine Codebase in den Container einbindet?] (Https://stackoverflow.com/questions/40914696/how-do-i-build-docker-images-when- my-development-environment-mounts-my-codebase – Matt

Antwort

1

Als Best Practice sollten Sie versuchen, um zu zielen eine Dockerdatei zu verwenden, um unerwartete Fehler zwischen verschiedenen Umgebungen zu vermeiden. Sie haben jedoch möglicherweise einen Anwendungsfall, in dem Sie dies nicht tun können.

Die Dockerfile-Syntax ist nicht reich genug, um ein solches Szenario zu unterstützen, jedoch können Sie dafür Shell-Skripte verwenden.

Erstellen Sie ein Shell-Skript, genannt install.sh, das tut so etwas wie:

if [ ${ENV} = "DEV" ]; then 
    composer install 
else 
    npm install 
fi 

In Ihrem Dockerfile dieses Skript hinzufügen und es dann auszuführen, wenn Gebäude

... 
COPY install.sh install.sh 
RUN chmod u+x install.sh && ./install.sh 
... 

Wenn ein Build arg Gebäudepass angeben die Umgebung, Beispiel:

docker build --build-arg "ENV=PROD" ... 
0

bauen können Sie zwei verschiedene Dockerfiles verwenden.

# ./Dockerfile (non production) 
FROM foo/bar 
MAINTAINER ... 

# .... 

Und ein zweiter:

# ./Dockerfile.production 
FROM foo/bar 
MAINTAINER ... 

RUN composer install 

Während die Build-Befehl aufrufen, können Sie die es verwenden Datei sagen sollte:

$> docker build -t mytag . 
$> docker build -t mytag-production -f Dockerfile.production . 
+0

Sorry, ich habe es überlesen, dass du das gerade machst! Sie können aber auch ENV-Variablen verwenden: https://StackOverflow.com/a/34545644/6849366 –

Verwandte Themen