ในอีกคำถามหนึ่งฆ่ากระบวนการลูกเมื่อผู้ปกครองออกจากฉันได้รับคำตอบที่ช่วยในการเรียงลำดับ
วิธีนี้เรากำหนดค่าโปรแกรมประยุกต์เพื่อที่จะบันทึกไปยังแฟ้มและต่อเนื่องtail -f
มัน โชคดีที่tail
สามารถยอมรับ--pid PID
: มันจะออกเมื่อกระบวนการที่ระบุออกจาก เราใส่ที่$$
นั่น: PID ของเชลล์ปัจจุบัน
ในขั้นตอนสุดท้ายแอปพลิเคชั่นที่เปิดตัวคือexec
'ed ซึ่งหมายความว่าเชลล์ปัจจุบันจะถูกแทนที่ด้วยแอปพลิเคชันนั้นอย่างสมบูรณ์
สคริปต์ของ Runner run.sh
จะมีลักษณะเช่นนี้:
#! /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
หมายเหตุ: โดยการใช้tail -F
เราจะลิสต์ชื่อไฟล์และมันจะอ่านมันแม้ว่ามันจะปรากฏในภายหลัง!
ในที่สุด, Dockerfile เรียบง่าย:
FROM ubuntu
ADD run.sh /root/run.sh
CMD ['/root/run.sh']
หมายเหตุ: เพื่อหลีกเลี่ยงtail -f
พฤติกรรมที่แปลกประหลาดบางอย่าง(ซึ่งบอกว่า "ถูกแทนที่ด้วยไฟล์รีโมตเลิกใช้ชื่อนี้") ฉันลองวิธีอื่น: ไฟล์บันทึกที่รู้จักทั้งหมดถูกสร้างขึ้น & ถูกตัดทอนเมื่อเริ่มต้น: วิธีนี้ฉันมั่นใจได้ว่า และหลังจากนั้นก็ให้ปิดมัน:
#! /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