Docker uygulaması stdout'a yazma


49

12 faktör danışmanlığına uygun bir üçüncü taraf uygulaması dağıtıyorum ve noktalardan biri uygulama günlüklerinin stdout / stderr'a yazdırılması gerektiğini söylüyor: kümeleme yazılımı bunu toplayabilir.

Ancak, uygulama yalnızca dosyalara veya syslog'a yazabilir. Bunun yerine bu günlükleri nasıl yazdırırım?


Zaten syslog gidiyorlar. Onları oradan alabilirsin!
Michael Hampton

@MichaelHampton, iyi görünüyor, ancak Docker stdout'a yazabilen tek bir işlem yapıyor ve bu ikisini birleştirmek gibi mi geliyor?
kolypto

1
Bir daemon süreci syslog kullanmak ve yazdırılan bir ön işlemi olabilir?
qkrijger

@ qkrijger, iyi nokta! Şimdi, eğer biri onunla deneyime sahipse ...?
kolypto

Yanıtlar:


107

Nginx Dockerfile'da inanılmaz bir tarif :

# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
    && ln -sf /dev/stderr /var/log/nginx/error.log

Basitçe, uygulama dosya olarak yazmaya devam edebilir, ancak sonuç olarak satırlar stdout& stderr!


2
Bu. Dır-dir. Sadece. Parlak. Ve çok yönlü.
uzay dalıcısı

11
Bununla ilgili problem olan tek şey, çalıştırdığınız şeyin köklü olmayan bir süreç olarak kendisini arka plana sokmakta ısrar etmesidir. Ben bununla yaşıyorum squid3ve o zaman izinleri ile ilgili sorun yaşıyor /dev/stdout.
mikepurvis

4
Bu her zaman işe yaramaz - örneğin, uygulama dosyayı aramaya çalışırsa, bu yöntem genellikle çalışmaz.
mixja

Bağlantı
kesildi

4
Her şey kazanmak için bir dosya.
RubberDuck

16

Başka bir soruda, ebeveyn çıkarken çocuk sürecini öldürün , bunu çözmede yardımcı olan cevabı aldım.

Bu şekilde, uygulamayı bir dosyaya kaydedecek şekilde yapılandırdık ve sürekli olarak uygulayalım tail -f. Neyse ki, tailkabul edebilir --pid PID: belirtilen işlemden çıktığında çıkacaktır. $$Orada koyduk : Geçerli kabuğun PID değeri.

Son bir adım olarak, başlatılan uygulama execonaylanır; bu, mevcut kabuğun tamamen bu uygulamayla değiştirildiği anlamına gelir.

Runner betiği run.shşöyle görünecek:

#! /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

NOT: kullanarak tail -Fdosya isimlerini listeleriz ve daha sonra ortaya çıksalar bile onları okuyacaktır!

Son olarak, minimalist Dockerfile:

FROM ubuntu
ADD run.sh /root/run.sh
CMD ['/root/run.sh']

Not: Bazı son derece garip tail -fdavranışları gidermek için ("uzak bir dosyayla değiştirildi. Bu isimden vazgeçiliyor" diyor) başka bir yaklaşım denedim: Bilinen tüm günlük dosyaları başlangıçta oluşturuldu ve kesildi: bu şekilde var olduklarını garanti ediyorum ve yalnızca o zaman - onları kuyruk:

#! /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

Özellikle Apache sunucusu için Pipetlenmiş günlükleri kullanıyorum ( httpd.apache.org/docs/2.4/logs.html#piped ) ve çalışıyor gibi görünüyor.
php-kodlayıcı

Alp ile benzer sorunları çözer tailve --pid seçeneği olmadan BusyBox'ta iyi çalışıyor gibi görünüyor .
Ryan

Geçici çözüm benim için çalıştı. son derece yararlı, teşekkür ederim.
Tamas Kalman

7

Liman işçisi konteynırındaki bir arka plan işlemi için, örneğin exec ile / bin / bash 'a bağlanmayı kullanabildim.

echo "test log1" >> /proc/1/fd/1

Bu çıktıyı, docker'ın aldığı bir pid 1'in stdout'una gönderir.


Bu doğru cevap. Günlükler PID1 için stdout'a gönderilmelidir ve uygulamanız başka bir PID altında çalışıyorsa, docker logsveya tarafından görülmez kubectl logs. PID1 olarak çalışmayan crontab aracılığıyla görev zamanlayan bir konteynerim var.
leeman24

6

nginx için size gelmiş olabilir nginx.confişaret /dev/stderrve /dev/stdoutbunun gibi

user  nginx;
worker_processes  4;
error_log  /dev/stderr;
http {
    access_log  /dev/stdout  main;
...

ve Dockerfilegirişiniz olmalıdır

/usr/sbin/nginx -g 'daemon off;'

Ana işlem olarak çalışmadığı zaman işe yaramazsaroot
peedee
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.