2015-08-28 25 views
9

Tôi đã tạo một vùng chứa docker để chạy các tác vụ với gulp. Tất cả các tác vụ đang chạy, vấn đề là tôi không thể bật tính năng tải lại trong Chrome mặc dù tôi đã tiếp xúc với cổng 35729 trong vùng chứa của mình.Làm thế nào để chạy ganeload với gulp trong một container docker?

Đây là 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"] 

tôi có thể tạo hình ảnh với lệnh sau:

docker build -t gulp_image . 

tôi tạo một bình chứa:

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

sau đó trong container của tôi

cd /var/www/my_app 
gulp 

Đây là Gulpfile.js tôi

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

Khi tôi chỉnh sửa một tập tin js, tôi có thể nhìn thấy trong container của tôi rằng các tập tin được xử lý nhưng khi tôi cố gắng để cho phép tải lại sống trong trình duyệt của tôi (Chrome), Tôi nhận được thông báo sau: "Không thể kết nối với máy chủ LiveReload .."

Bất cứ ai cũng có một đầu mối về những gì tôi đã bỏ lỡ hoặc không làm? Cảm ơn bạn đã đọc!

+0

trong lệnh chạy của bạn, tôi không thấy '-p 80'and như vậy? – user2915097

+0

Bạn có đang sử dụng Windows hoặc OS X không? – Thomasleveil

+0

Tôi đang sử dụng Linux (bạc hà) Tôi đã thử với lệnh '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' nhưng nó không tốt hơn. Khi tôi chạy 'docker ps -a', tôi có thể thấy các cổng được kích hoạt trong Dockerfile của tôi được tính đến. – jiboulex

Trả lời

15

Hiển thị các cổng trong vùng chứa không ngụ ý rằng các cổng sẽ được mở trên máy chủ đế. Bạn nên sử dụng tùy chọn docker run-p. Các tài liệu cho biết:

-p = []: Xuất bản một cổng container hoặc một loạt các cổng để dẫn chương trình

định dạng:ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort

Cả hai hostPortcontainerPort có thể được chỉ định là một loạt các cổng.

Khi chỉ định phạm vi cho cả hai, số lượng cổng chứa trong phạm vi phải khớp với số> của các cổng lưu trữ trong phạm vi. (Ví dụ, -p 1234-1236:1234-1236/tcp) (sử dụng 'cổng Docker' để xem các bản đồ thực tế)

Kể từ khi bạn đã thử các hình thức -p containerPort, cảng thực tế đã mở trên máy chủ của bạn (Linux bạc hà) đã được lựa chọn ngẫu nhiên bởi Docker khi bạn chạy lệnh docker run. Để tìm ra cổng nào đã được chọn, bạn phải sử dụng lệnh docker port.

Vì điều này không thuận tiện, bạn nên sử dụng biểu mẫu -p hostPort:containerPort và chỉ định rằng hostPort35729.(Tôi cũng giả định bạn mong đợi cổng 80, 8080 và 3000 có thể truy cập theo cách tương tự)

Lệnh chạy container của bạn sau đó sẽ là:

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 

Một cách dễ dàng hơn để đối phó với các cảng là chạy vùng chứa docker của bạn trong host networking mode. Trong chế độ này, bất kỳ cổng nào được mở trên vùng chứa trên thực tế được mở trên giao diện mạng máy chủ (chúng thực sự là cả hai cùng chia sẻ cùng một giao diện).

Sau đó, bạn sẽ bắt đầu container của bạn với:

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

Cảm ơn bạn @Thomasleveil! Nó hoạt động hoàn hảo! – jiboulex

Các vấn đề liên quan