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.
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
.
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!
Tôi đã sử dụng 'nhật ký docker -f [docker_name]' –
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. –
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ì. –