2015-08-28 22 views
9

Utworzono kontener dokera, aby wykonywać zadania z haustem. Wszystkie zadania są uruchomione, problem polega na tym, że nie mogę włączyć livrereload w Chrome, chociaż odsłoniłem port 35729 w moim kontenerze.Jak uruchomić livereload z gulpem w kontenerze dokowania?

Oto 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"] 

tworzę obraz za pomocą następującego polecenia:

docker build -t gulp_image . 

tworzę kontener:

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

następnie w moim zbiorniku

cd /var/www/my_app 
gulp 

Oto moja 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']); 

Kiedy edytować plik js, widzę w moim zbiorniku, że pliki są przetwarzane, ale gdy próbuję włączyć żywo reload w mojej przeglądarce (Chrome), Otrzymałem następujący komunikat: "Nie można połączyć się z serwerem LiveReload."

Ktoś ma pojęcie o tym, co przegapiłem lub czego nie zrobiłem? Dzięki za przeczytanie!

+0

w Twoim poleceniu uruchamiania, nie patrz '-p 80'and tak? – user2915097

+0

Czy jesteś w systemie Windows lub OS X? – Thomasleveil

+0

Jestem na Linux (mennica) Próbowałem za pomocą polecenia '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', ale nie było lepiej. Po uruchomieniu 'docker ps -a' widzę włączone porty w moim pliku Dockerfile. – jiboulex

Odpowiedz

15

Ujawnianie portów w kontenerze nie oznacza, że ​​porty będą otwierane na hoście dokera. Powinieneś używać opcji docker run-p. Dokumentacja mówi:

p = []: Publish port pojemnikach lub zakres portów dla gospodarza

format:ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort

Zarówno hostPort, jak i containerPort można określić jako zakres portów.

Podczas określania zakresów dla obu, liczba portów kontenera w zakresie musi odpowiadać liczbie> portów hosta w zakresie. (Np -p 1234-1236:1234-1236/tcp) (stosowanie „Port Robotnik”, aby zobaczyć rzeczywiste odwzorowanie)

Ponieważ próbowali formę -p containerPort rzeczywista portu otwarto hosta (Linux Mint) została losowo wybrana przez dokowanym po uruchomieniu polecenie docker run. Aby dowiedzieć się, jaki port został wybrany, musisz użyć polecenia docker port.

Ponieważ nie jest to wygodne, należy użyć formularza -p hostPort:containerPort i określić, że hostPort to 35729.(zakładam też można oczekiwać porty 80, 8080 i 3000 mają być dostępne w taki sam sposób)

Komenda uruchomić pojemnik będzie wówczas:

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 

Łatwiejszy sposób radzić sobie z portów jest uruchomienie kontenera dokera w host networking mode. W tym trybie każdy port otwarty w kontenerze jest faktycznie otwarty na interfejsie sieci hosta (w rzeczywistości oba mają ten sam interfejs).

Można by następnie rozpocząć pojemnik:

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

Dziękuję @Thomasleveil! Działa doskonale! – jiboulex

Powiązane problemy