2015-10-07 28 views
10

Tôi đang lập kế hoạch luồng công việc cho dev tiêu biểu trên một ứng dụng nodejs. Tôi đoán hầu hết các bạn sẽ:Gỡ lỗi Nodej bên trong ngăn chứa Docker

git clone [appcode] + (Dockerfile với bản đồ tích để con đường địa phương)> Docker-soạn xây dựng> Docker-soạn lên

Sau đó, tôi chỉnh sửa một số mã, Sau đó, thiết bị đầu cuối Ctrl + C để giết quá trình hiện tại> docker-compose up (hoặc cấu hình container của bạn để sử dụng nodemon để xem các thay đổi mã) và làm mới trình duyệt để xem mã cục bộ mới nhất đang chạy.

Có phải tất cả những điều trên trông khá chuẩn?

Câu hỏi chính của tôi là có ai gỡ lỗi hoặc bằng IDE hoặc kiểm tra nút vào vùng chứa không?

Tôi đã thử hiển thị cổng, v.v. Kết nối bị từ chối. Tôi tin rằng vì node.js sẽ chỉ cho phép gỡ lỗi trên 127.0.0.1 WEBC858

+0

Tôi đã sử dụng 'nhật ký docker -f [docker_name]' –

+0

Vì vậy, @NguyenSyThanhSon là bạn nói bạn sử dụng nhật ký để thực hiện gỡ lỗi đơn giản bằng cách đăng xuất khi cần thiết? Tôi đã hy vọng cho một giải pháp mà tôi có thể thiết lập điểm ngắt giống như tôi có thể trong một dự án nút bình thường bằng cách sử dụng webstorm. –

+0

Làm việc này một chút, nghĩ rằng giải pháp của tôi là khá sạch sẽ. Cho tôi biết bạn nghĩ gì. –

Trả lời

22

Tôi đã quản lý để chạy nó ở đây. Tôi muốn tôi có thể chạy nút thanh tra như một thùng chứa sidekick, nó sẽ rất sạch sẽ (EDIT: Có thể, xem kết thúc của câu trả lời). Thật không may, nhìn vào các nguồn kiểm tra nút, không thể chạy trình kiểm tra nút từ xa (vì nút thanh tra cần truy cập các tệp để nó có thể hiển thị chúng) vì vậy ngay cả liên kết vùng chứa cũng nằm ngoài cửa sổ. Có lẽ nó sẽ hỗ trợ nó tại một số điểm.

Đây là giải pháp của tôi:

Trong Dockerfile, hãy cài đặt trình kiểm tra nút. Tôi quyết định làm cho nó toàn cầu để tôi có thể sử dụng cùng một container để gỡ lỗi tất cả các ứng dụng của tôi.

RUN npm install -g node-inspector 

Thay vì ăn trưa nút trong lệnh CMD, sử dụng một kịch bản bash mà sẽ cho phép bạn khởi động hơn một quá trình duy nhất. Đây không phải là cách Docker nhưng như tôi đã nói, giới hạn trong node-inspector ngăn cản chúng ta sử dụng container sidekick. Bạn cũng có thể sử dụng một giải pháp mạnh mẽ hơn cho quản lý quy trình như supervisor nhưng để gỡ lỗi một kịch bản đơn giản là đủ theo ý kiến ​​của tôi.

CMD ["/bin/bash", "start.sh"] 

kiểm tra kịch bản này cho sự hiện diện của một biến DEBUG môi trường để khởi động nút và cho phép gỡ lỗi.

#!/bin/bash 

if [ -z ${DEBUG+x} ]; then 
    node server.js 
else 
    node-inspector --web-port 9080 & 
    node --debug server.js 
fi 

Tôi đoán bạn có thể sử dụng cùng một mẹo để cài đặt hoặc không kiểm tra nút. Bạn thậm chí có thể có conditional statement in RUN command nếu bạn muốn bỏ qua tập lệnh để cài đặt.

Sau đó, khi bạn muốn gỡ lỗi một container, khởi động nó như vậy:

docker run -d -P -p 9080:9080 --env DEBUG=1 --name my_service \ 
    -v /home/docker/sources/.../:/usr/src/app custom-node 

Bây giờ bạn chỉ cần nhấn ip Docker daemon để gỡ lỗi vì chúng ta tiếp xúc với các cổng debug quy định trong kịch bản (9080) trên lệnh docker run. Dockerfile của tôi đã cho thấy cổng chính của tôi vì vậy tôi đã sử dụng -P cho điều đó.

Nếu vùng chứa của bạn chạy trên máy ảo cục bộ và bạn được thiết lập phía sau proxy, hãy đảm bảo nó hỗ trợ địa chỉ cục bộ hoặc bạn tắt nó trước khi gỡ lỗi.


EDIT: hiện đang làm việc với container sidekick

Dưới đây là là nội dung của container nút-debug tôi Dockerfile

FROM node:4.2.1 

EXPOSE 9080 

RUN npm install -g node-inspector 

CMD ["node-inspector", "--web-port", "9080"] 

Docker cho chúng ta 2 tính năng để làm cho nó như thể node- thanh tra đang chạy cục bộ với quy trình nút.

  1. Mặc dù nút-Thanh tra dường như ngụ ý bạn có thể kết nối với máy tính từ xa bằng cách nói với bạn để kết nối với 127.0.0.1:8080/?ws=127.0.0.1&port=5858, tôi không thể tìm thấy bất kỳ mã đó đã được phân tích các tham số ws vì vậy tôi sử dụng Docker tùy chọn cấu hình ròng bật hộp chứa gỡ lỗi nút trong cùng một ngăn xếp mạng như quy trình gỡ lỗi của tôi: --net=container:mysvc. Bằng cách này, trình kiểm tra nút có thể mở kết nối websocket to localhost:5858.

  2. Bằng cách sử dụng cùng một điểm gắn kết như quá trình gỡ lỗi của bạn, bạn có thể xác định vị trí tệp giả cho quá trình kiểm tra nút.

Bây giờ để thuận tiện hơn một chút, tôi khuyên bạn nên sử dụng data container cho nguồn ứng dụng của mình.

Nếu bạn muốn khả năng bắt đầu nút trong gỡ lỗi hay không, hãy tiếp tục sử dụng tập lệnh start.sh (loại bỏ lệnh thanh tra nút mặc dù). Tôi tự hỏi nếu chúng ta có thể sử dụng một signal với docker mặc dù, mà sẽ loại bỏ sự phụ thuộc vào start.sh hoàn toàn.

if [ -z ${DEBUG+x} ]; then 
    node server.js 
else 
    node --debug server.js 
fi 

Vì vậy, tạo ra nơi chứa dữ liệu:

ứng dụng nút
docker create -v /home/docker/sources/.../:/usr/src/app \ 
    --name my_service-src custom-node /bin/true 

Launch và phơi bày nút-Thanh tra debug port:

docker run -d -P -p 9080:9080 --env DEBUG=1 --name my_service \ 
    --volumes-from my_service-src custom-node 

Launch nút-debug container:

docker run -d --net=container:my_service --volumes-from my_service-src \ 
    --name node-debug node-debug 

Bằng cách này, bạn có thể nhanh chóng sinh ra n ode-debug container trên bay để gỡ lỗi một quá trình nút.

Kết nối với ip docker và tận hưởng phiên gỡ lỗi của bạn!

+0

Đây là vinh quang, tôi không nghĩ bạn có đủ tín dụng cho nó! –

+0

kiểm tra nút không được chấp nhận, xem github.com/node-inspector/node-inspector – Gerd

0

Sử dụng hai hình ảnh khác nhau cho trình gỡ lỗi (nút gỡ lỗi) và máy chủ ứng dụng (nút tùy chỉnh) không có ý nghĩa trong trường hợp này. Vì gói tùy chỉnh-nút cũng cần phải cài đặt nhị phân bộ kiểm tra nút. Nếu không, Không thể tìm thấy mô-đun '/usr/lib/node_modules/node-inspector/lib/InjectorServer.js' lỗi được đẩy vào bảng điều khiển phía máy khách kiểm tra nút và không có gì đang được gỡ lỗi.

0

Tôi có một giải pháp thay thế tương tự như của Eric ở trên nhưng sử dụng máy chủ thay vì mạng chứa.

  • Trong nút chính.chứa js, đồ cổng 5900 đến host
  • Run quá trình nút chính với debug kích hoạt
  • Sử dụng một container riêng biệt để chạy node-Thanh tra
  • Sử dụng máy chủ mạng cho container nút-Thanh tra

tôi đã viết một vài chi tiết về nó ở đây: https://keylocation.sg/our-tech/debugging-nodejs-in-docker-using-node-inspector

0

Sau khi đấu tranh cho một thời gian để có được điều này để làm việc, tôi thấy rằng việc thêm:

--inspect-brk=0.0.0.0:9229

thay vì chỉ thông thường inspect-brk

làm cho mọi việc.

Bạn cũng sẽ cần để ánh xạ cổng của bạn một cách chính xác trong lệnh Docker chạy của bạn:

-p 9229:9229

Full dụ:

docker run -ti -p 3000:3000 -p 9229:9229 -v `pwd`:/app/ myImage bash 

node --inspect-brk=0.0.0.0:9229 /app/index.js 

Sau đó đi đến chrome: // kiểm tra

Và nhấn "Mở DevTools chuyên dụng cho Nút" và tất cả sẽ hoạt động :)

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