2015-08-28 74 views
9

我創建了一個docker容器來運行吞噬任務。 所有任務都在運行,問題是我無法在Chrome中啓用livrereload,但我公開了35729端口在我的容器中。如何在碼頭集裝箱內使用gulp運行livereload?

這裏是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"] 

我創建使用以下命令圖像:

docker build -t gulp_image . 

我創建了一個容器:

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

然後在我的容器

cd /var/www/my_app 
gulp 

這裏是我的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']); 

當我編輯一個js文件,我可以在我的容器中看到,文件處理,但是當我試圖讓現場重裝在我的瀏覽器(Chrome)我收到以下消息:「無法連接到LiveReload服務器..」

任何人都知道我錯過了什麼或沒有做什麼? 感謝您的閱讀!

+0

,我沒有看到'-p 80'and這樣嗎? – user2915097

+0

你在Windows或OS X上嗎? – Thomasleveil

+0

我在Linux上(薄荷) 我用命令'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'但它不是更好。 當我運行docker ps -a時,我可以看到我的Dockerfile中已啓用的端口已考慮在內。 – jiboulex

回答

15

暴露容器中的端口並不意味着端口將在docker主機上打開。您應該使用docker run-p選項。文檔說:

-p = []:發佈端口中的容器端口或一組給主機

格式:ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort

hostPortcontainerPort都可以被指定爲一個範圍的端口。

指定兩者的範圍時,範圍內的容器端口數必須與該範圍內的主機端口數>相匹配。 (例如,-p 1234-1236:1234-1236/tcp) (使用「泊塢窗口」看到實際的映射)

既然你試過-p containerPort形式,實際的端口主機(Linux Mint的)上打開隨機由搬運工人選擇當您運行docker run命令。要確定選擇了哪個端口,您必須使用docker port命令。

由於這樣不方便,您應該使用-p hostPort:containerPort表單,並指定hostPort35729(我還以爲你希望端口80,8080和3000可訪問相同的方式),那麼

的命令來運行你的容器應爲:

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 

更簡單的方法來處理端口是在host networking mode中運行您的碼頭集裝箱。在這種模式下,容器上打開的任何端口實際上都在主機網絡接口上打開(它們實際上都共享相同的接口)。

你會再開始你的容器:

docker run --name=gulp_container -i -t --rm \ 
    -v /var/www/my_app:/var/www/my_app:rw \ 
    --net=host \ 
    gulp_image bash 
運行中的命令
+0

謝謝@Thomasleveil!它完美的工作! – jiboulex

相關問題