如何在docker容器中运行livereload和gulp?

时间:2015-08-28 07:52:44

标签: javascript docker gulp livereload

我创建了一个docker容器来运行gulp任务。 所有任务都在运行,问题是我无法在Chrome中启用livrereload,尽管我在容器中公开了35729端口。

这是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服务器.."

任何人都知道我错过了什么或者没做过什么? 谢谢你的阅读!

1 个答案:

答案 0 :(得分:15)

在容器中公开端口并不意味着将在docker主机上打开端口。您应该使用docker run -p选项。文档说:

  

-p = []:将容器端口或一系列端口发布到主机

     

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

     

hostPortcontainerPort都可以指定为一系列端口。

     

为两者指定范围时,范围内的容器端口数必须与数字>匹配。范围内的主机端口。 (例如-p 1234-1236:1234-1236/tcp)    (使用'docker port'查看实际的映射)

由于您尝试了-p containerPort表单,因此当您运行docker run命令时,docker会随机选择在您的主机上打开的实际端口(Linux mint)。要确定选择了哪个端口,必须使用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容器。在这种模式下,容器上打开的任何端口实际上都是在主机网络接口上打开的(它们实际上都是共享同一个接口)。

然后您将使用以下命令启动容器:

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