Trong một câu hỏi khác, Giết con xử lý khi cha mẹ thoát ra , tôi nhận được phản hồi giúp loại bỏ điều này.
Bằng cách này, chúng tôi định cấu hình ứng dụng để nó đăng nhập vào một tệp và liên tục tail -f
. May mắn thay, tail
có thể chấp nhận --pid PID
: nó sẽ thoát khi quá trình được chỉ định thoát. Chúng tôi đặt $$
ở đó: PID của vỏ hiện tại.
Bước cuối cùng, ứng dụng đã khởi chạy là exec
'ed, có nghĩa là trình bao hiện tại được thay thế hoàn toàn bằng ứng dụng đó.
Kịch bản của người chạy run.sh
, sẽ giống như thế này:
#! /usr/bin/env bash
set -eu
rm -rf /var/log/my-application.log
tail --pid $$ -F /var/log/my-application.log &
exec /path/to/my-application --logfile /var/log/my-application.log
LƯU Ý: bằng cách sử dụng tail -F
chúng tôi liệt kê tên tệp và nó sẽ đọc chúng ngay cả khi chúng xuất hiện sau!
Cuối cùng, Dockerfile tối giản:
FROM ubuntu
ADD run.sh /root/run.sh
CMD ['/root/run.sh']
Lưu ý: để làm việc với một số tail -f
hành vi cực kỳ lạ (có nghĩa là "đã được thay thế bằng một tệp từ xa. Từ bỏ tên này") tôi đã thử một cách tiếp cận khác: tất cả các tệp nhật ký đã biết được tạo và cắt bớt khi khởi động: cách này tôi đảm bảo chúng tồn tại và chỉ sau đó - theo đuôi họ:
#! /usr/bin/env bash
set -eu
LOGS=/var/log/myapp/
( umask 0 && truncate -s0 $LOGS/http.{access,error}.log )
tail --pid $$ -n0 -F $LOGS/* &
exec /usr/sbin/apache2 -DFOREGROUND