Làm thế nào để điều tra một quá trình chính đã chết trong một container docker?


13

Đôi khi bạn phải điều tra một container bị dừng hoặc một container sau khi khởi động chết rất nhanh và dừng lại.

docker exec -ti <id> bash chỉ hoạt động trên các container đang chạy, khi nó kết thúc, dấu nhắc bash cũng chấm dứt.

Với việc docker startbạn không thể cung cấp một lệnh khác và nếu container chết đột ngột một lần nữa, bạn sẽ không có đủ thời gian để vào container và thực hiện các điều tra của mình.

Chúng ta có thể thực hiện docker commit, sau đó docker runtrên hình ảnh mới bằng một lệnh khác, nhưng tôi tự hỏi liệu có bất kỳ lựa chọn thay thế nào khác không.

Lưu ý : docker logschỉ trả về bất cứ ứng dụng nào được in ra thiết bị xuất chuẩn / thiết bị xuất chuẩn. Điều đó có thể không đủ để tìm ra vấn đề là gì.


Sau một thời gian suy nghĩ về nó: Docker quy trình chính ???? Vì mục đích chỉ chạy một tiến trình, nên thuật ngữ 'chính' sẽ bị xóa hoặc bạn đang làm điều gì đó kỳ lạ (như chạy quy trình init) hoặc bạn đang lấy các luồng làm quy trình ... Tôi cho rằng đó là tùy chọn một, nhưng tôi phải nói điều đó vì nó làm phiền tôi
Tensibai

@Tensibai đôi khi bạn phải chạy một cái gì đó như dumb-init, để xử lý vấn đề pid 1 / báo hiệu trong các container, nếu lệnh chính của bạn không thể tự xử lý nó. Cũng có thể có những trường hợp khác trong đó một container
docker

Vâng, đó là những gì tôi gọi là kỳ lạ, chủ yếu là vì các container đã được tạo ra để cô lập một quy trình. Đôi khi các container không phải là giải pháp cho một ứng dụng, việc sẵn sàng đặt mọi thứ vào trong một container là một con đường dẫn đến đau đầu hơn bất cứ điều gì khác.
Tensibai

Câu trả lời:


9

Các cách chung để theo dõi tại sao một quá trình trong Linux thất bại là tốt. Một cách như vậy là chạy một quy trình bằng cách sử dụng stracenó sẽ cho bạn biết quy trình gọi hệ thống đã làm và thường chỉ ra lý do lỗi.

Bạn có thể tạo một Dockerfilecái trông giống như thế này:

FROM original_image

RUN apt-get -y update && apt-get install -y strace

# build with `docker build -t debug_version`

Sau đó chạy hình ảnh mới của bạn bằng cách sử dụng docker run debug_version strace original_cmd.

Đối với các quá trình rẽ nhánh trẻ em (và sau đó chết), bạn muốn chạy stracevới -fftùy chọn. Bạn cũng có thể ánh xạ một số tệp bằng cách sử dụng khối lượng dữ liệu Docker và sử dụng -otùy chọn straceđể ghi vào nó. Nhưng nói chung stracesẽ để lại đầu ra trên thiết bị xuất chuẩn, có thể đọc được bằng cách sử dụng docker log.

Q liên quan : Quá trình Linux chấm dứt một cách bí ẩn


Điều này có nghĩa là tôi vẫn phải docker commitdừng container trước để có hình ảnh bắt đầu từ
SztupY

Bạn nói nó chết khi bắt đầu. Tôi giả sử bạn có một hình ảnh sau đó. Đối với những người đã dừng lại, có một cam kết được yêu cầu.
Evgeny

Đó chỉ là một trong những tình huống để có một container bị dừng lại
SztupY

Ngoài ra còn có một gói cho stracetrong Alpine Linux, pkgs.alpinelinux.org/package/edge/main/x86_64/strace . Sử dụng trình quản lý gói Alpine để cài đặt nó apk install strace.
Evgeny

3

Theo như tôi biết, commitrunlà những lựa chọn tốt nhất ở đây để cung cấp cho bạn toàn quyền truy cập vào container như khi nó chết.

Lý tưởng nhất, container của bạn sẽ đưa ra một số thông tin hữu ích hơn khi nó thất bại, nhưng đó là một chủ đề khác hoàn toàn.

Chỉnh sửa: để mở rộng câu trả lời của tôi, nếu container chết ngay khi bắt đầu, bạn cũng có thể sử dụng docker runđể chỉ định một thay thế --entrypointCMD. Nói chung, tôi sẽ đặt vòng lặp này thành một vòng lặp hoặc thứ gì đó sẽ không tự thoát. Khi bạn đang ở trong vùng chứa, bạn có thể tự chạy các bước bị lỗi và sau đó kiểm tra kết quả mà không phải lo lắng về việc thoát khỏi vùng chứa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.