2016-07-18 137 views
6

Abbiamo un'applicazione AngularJS. Abbiamo scritto un docker per esso in modo che sia riutilizzabile su ogni sistema. Il dockerfile non è una best practice ed è forse un po 'strano build up (build e hosting nello stesso file) per alcuni, ma è appena creato per eseguire localmente la nostra app angularjs su ogni PC di ogni sviluppatore.Immagine docker riutilizzabile per AngularJS

Dockerfile: 
FROM nginx:1.10 

... Steps to install nodejs-legacy + npm 

RUN npm install -g gulp 
RUN npm install 
RUN gulp build 

.. steps to move dist folder 

costruiamo la nostra immagine con docker build -t myapp:latest . Ogni sviluppatore è in grado di eseguire la nostra applicazione con docker run -d -p 80:80 myapp:latest

Ma ora stiamo sviluppando altri backend. Così abbiamo un backend in DEV, un backend in SVS, ... Quindi ci sono diversi URL che abbiamo bisogno di usare in /config/xx.json

{ 
    ... 
    "service_base": "https://backend.test.xxx/", 
    ... 
} 

Noi non vogliamo cambiare questo URL ogni volta, ricostruire il immagine e avviarlo. Inoltre, non vogliamo dichiarare URLS (dev, uat, prod, ..) che possono essere utilizzati lì. Vogliamo eseguire il nostro processo gulp build con una variabile di ambiente invece di un URL codificato.

Così possiamo iniziare il nostro contenitore come questo:

docker run -d -p 80:80 --env URL=https://mybackendurl.com app:latest 

C'è qualcuno che ha esperienza con questo tipo di problemi? Quindi avremo bisogno di una variabile env nel nostro json e la costruiremo e aggiungeremo l'URL in seguito, se possibile.

risposta

1

EDIT: opzione migliore è quella di utilizzare costruire args

Invece di passare URL al comando di marcia finestra mobile, è possibile utilizzare finestra mobile costruire args. È preferibile che i comandi relativi alla generazione vengano eseguiti durante la creazione della finestra mobile rispetto all'esecuzione della finestra mobile.

Nella tua Dockerfile,

ARG URL 

e quindi eseguire

docker build --build-arg URL=<my-url> . 

Vai a questa stackoverflow question per i dettagli

+0

Quindi probabilmente ho anche bisogno di eseguire il build gulp in quel file .sh + tutti i passaggi dopo di esso – lvthillo

+0

Non penso che sia una buona idea. entrypoint.sh verrà eseguito durante il comando di esecuzione finestra mobile e non durante la creazione della finestra mobile. Potrebbe essere necessaria una soluzione diversa se si desidera eseguire gulp come parte della build della finestra mobile. – atv

+0

In questo caso, sta funzionando durante il comando di esecuzione della finestra mobile. Altrimenti non sarò in grado di dare un VAR ENV al mio contenitore (e di eseguire un gulp su di esso) – lvthillo

0

Questa era la mia 'soluzione'. So che non è il miglior approccio docker, ma solo per i nostri sviluppatori è stato di grande aiuto.

mio dockerfile si presenta così:

FROM nginx:1.10 

RUN apt-get update && \ 
apt-get install -y curl 

RUN sed -i "s/httpredir.debian.org/`curl -s -D - http://httpredir.debian.org/demo/debian/ | awk '/^Link:/ { print $2 }' | sed -e '[email protected]<http://\(.*\)/debian/>;@\[email protected]'`/" /etc/apt/sources.list 

RUN \ 
    apt-get clean && \ 
    apt-get update && \ 
    apt-get install -y nodejs-legacy && \ 
    apt-get install -y npm 

WORKDIR /home/app 
COPY . /home/app 

RUN npm install -g gulp 
RUN npm install 

COPY start.sh/
CMD ["./start.sh"] 

Così, dopo l'intero includono dell'app + NPM installazione dentro la mia nginx che avvio il mio contenitore con lo script start.sh.

Il contenuto di start.sh:

#!/bin/bash 
sed -i '[email protected]@'"$DATA_ACCESS_URL"'@' configs/config.json 
gulp build 
rm -r /usr/share/nginx/html/ 
//cp right folders which are created by gulp build to /usr/share/nginx/html 
... 
//start nginx container 
/usr/sbin/nginx -g "daemon off;" 

Quindi l'accumulo succede se il contenitore si avvia. Non è certo il modo migliore, ma è tutto per le esigenze degli sviluppatori. Avere un frontend locale facile.

Il comando sed eseguirà un sostituirà il file di configurazione che contiene qualcosa come:

{ 
    "service_base": "my-url", 
} 

Quindi il mio-url sarà sostituito dalla mia il contenuto della mia variabile d'ambiente che ho Willd definisco nel mio comando docker run .

di quanto sono in grado di eseguire.

docker run -d -p 80:80 -e DATA_ACCESS_URL=https://mybackendurl.com app:latest 

E ogni sviluppatore può utilizzare il frontend localmente e connettersi con il proprio URL di back-end.