Đối với luận án của tôi tại Đại học, tôi đang làm việc trên một hệ thống bảng dẫn mã hóa nơi người dùng có thể biên dịch/chạy mã không đáng tin cậy thông qua các vùng chứa tạm thời. Hệ thống dường như hoạt động tốt cho đến nay, nhưng một vấn đề tôi đang gặp phải là khi mã cho một vòng lặp vô hạn được gửi, Ví dụ:Thời gian chờ của đế chế cho vùng chứa?
while True:
print "infinite loop"
hệ thống đi haywire. Vấn đề là khi tôi đang tạo một container docker mới, trình thông dịch Python ngăn cản docker giết chết container con khi dữ liệu vẫn đang được in tới STDOUT (mãi mãi). Điều này dẫn đến lỗ hổng khổng lồ của Docker ăn lên tất cả các tài nguyên hệ thống có sẵn cho đến khi máy sử dụng hệ thống hoàn toàn bị đóng băng (hình dưới đây):
Vì vậy, câu hỏi của tôi là, là có một cách tốt hơn để thiết lập một thời gian chờ trên một docker container hơn so với phương pháp hiện tại của tôi mà thực sự sẽ làm giết container docker và làm cho hệ thống của tôi an toàn (mã ban đầu được lấy từ here)?
#!/bin/bash
set -e
to=$1
shift
cont=$(docker run --rm "[email protected]")
code=$(timeout "$to" docker wait "$cont" || true)
docker kill $cont &> /dev/null
echo -n 'status: '
if [ -z "$code" ]; then
echo timeout
else
echo exited: $code
fi
echo output:
# pipe to sed simply for pretty nice indentation
docker logs $cont | sed 's/^/\t/'
docker rm $cont &> /dev/null
Chỉnh sửa: Thời gian chờ mặc định trong đơn của tôi (được chuyển đến số $to
biến) là "10s"/10 giây.
Tôi đã cố gắng tìm cách thêm một bộ đếm thời gian và sys.exit()
đến nguồn python trực tiếp, nhưng điều này là không thực sự là một lựa chọn khả thi vì nó có vẻ khá an toàn vì người dùng có thể gửi mã để ngăn chặn nó từ thực hiện, có nghĩa là vấn đề vẫn tồn tại. Oh những niềm vui của bị mắc kẹt trên một luận án ... :(
Tôi có thể thiếu một thứ gì đó, nhưng tại sao bạn không thể làm điều gì đó như: 'ID = $ (docker run -d unsecure) && docker run --rm cleanup $ ID', nơi dọn dẹp là một container chứa một container khác sau X giây? –
"forever" - hãy thử giảm kích thước bộ đệm stdout. Trạng thái của quá trình container-'python' của bạn là gì sau khi bạn gửi tín hiệu? –
Bạn có thể đặt giới hạn về thời gian cpu bằng cách sử dụng python với tài nguyên lib, một tập lệnh python có thể được kiểm tra và thay đổi khi chạy bằng cách sử dụng ast –