2015-08-28 19 views
9

Ho creato un contenitore finestra mobile per eseguire attività con gulp. Tutte le attività sono in esecuzione, il problema è che non riesco ad abilitare livrereload in Chrome anche se ho esposto la porta 35729 nel mio contenitore.Come eseguire livereload con gulp in un contenitore docker?

Ecco la Dockerfile:

FROM ubuntu:latest 
MAINTAINER jiboulex 

EXPOSE 80 8080 3000 35729 

RUN apt-get update 
RUN apt-get install curl -y 
RUN apt-get install software-properties-common -y 
RUN add-apt-repository ppa:chris-lea/node.js 
RUN apt-get update 
RUN apt-get install nodejs -y 
RUN curl -L https://www.npmjs.com/install.sh | sh 
RUN npm install --global gulp -y 

# overwrite this with 'CMD []' in a dependent Dockerfile 
CMD ["/bin/bash"] 

creo l'immagine con il seguente comando:

docker build -t gulp_image . 

creo un contenitore:

docker run --name=gulp_container -i -t --rm -v /var/www/my_app:/var/www/my_app:rw gulp_image bash 

poi nel mio container

cd /var/www/my_app 
gulp 

Ecco il mio Gulpfile.js

var gulp = require('gulp'), 
livereload = require('gulp-livereload'), 
exec = require('child_process').exec; 
gulp.task('js', function() { 
gulp.src([ 
    './src/js/*.js' 
]).pipe(livereload()); 
}); 
gulp.task('watch', function(){ 
var onChange = function (event) { 
    console.log('File '+event.path+' has been '+event.type); 
}; 
livereload.listen(); 
gulp.watch([ 
    './src/js/*.js' 
], ['js']) 
    .on('change', onChange); 
}); 
gulp.task('default', ['watch', 'js']); 

Quando modifica un file js, posso vedere nel mio contenitore che i file vengono elaborati, ma quando provo ad abilitare ricarica dal vivo nel mio browser (Chrome), Ho ricevuto il seguente messaggio: "Impossibile connettersi al server LiveReload .."

Qualcuno ha un indizio su cosa ho perso o non fatto? Grazie per la lettura!

+0

in ordine di marcia, non vedo il '-p 80'and così? – user2915097

+0

Sei su Windows o OS X? – Thomasleveil

+0

Sono su Linux (nuovo) Ho provato con il comando 'docker run --name = gulp_container -i -t -p 80 -p 35729 --rm -v/var/www/my_app:/var/www/my_app : rw gulp_image bash', ma non era meglio. Quando eseguo 'docker ps -a' posso vedere le porte abilitate nel mio Dockerfile sono prese in considerazione. – jiboulex

risposta

15

L'esposizione di porte in un contenitore non implica che le porte vengano aperte sull'host di docker. Dovresti utilizzare l'opzione docker run-p. La documentazione dice:

-p = []: Pubblicare un porto container o di un intervallo di porte per l'host

formato:ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort

Entrambe hostPort e containerPort possono essere specificate come un intervallo di porte.

Quando si specificano intervalli per entrambi, il numero di porte del contenitore nell'intervallo deve corrispondere al numero> di porte host nell'intervallo. (Ad esempio, -p 1234-1236:1234-1236/tcp) (uso 'porta finestra mobile' per vedere la mappatura reale)

Dal momento che si è tentato il modulo -p containerPort, l'attuale porto aperto sul proprio host (Linux Mint) è stato scelto in modo casuale da finestra mobile quando si esegue il comando docker run. Per capire quale porta è stata scelta, è necessario utilizzare il comando docker port.

Poiché ciò non è conveniente, è necessario utilizzare il modulo -p hostPort:containerPort e specificare che hostPort è 35729.(Suppongo inoltre che ci si aspetta porte 80, 8080 e 3000 siano accessibili nella stessa maniera)

Il comando per eseguire il vostro contenitore sarebbe allora:

docker run --name=gulp_container -i -t --rm \ 
    -v /var/www/my_app:/var/www/my_app:rw \ 
    -p 35729:35729 \ 
    -p 80:80 \ 
    -p 8080:8080 \ 
    -p 3000:3000 \ 
    gulp_image bash 

Un modo più semplice per trattare con i porti è quello di eseguire il contenitore docker in host networking mode. In questa modalità, qualsiasi porta aperta sul contenitore viene infatti aperta sull'interfaccia di rete host (in realtà entrambi condividono la stessa interfaccia).

Si potrebbe quindi iniziare il vostro contenitore con:

docker run --name=gulp_container -i -t --rm \ 
    -v /var/www/my_app:/var/www/my_app:rw \ 
    --net=host \ 
    gulp_image bash 
+0

Grazie @Thomasleveil! Funziona perfettamente! – jiboulex

Problemi correlati