Wdrażam aplikację innej firmy zgodnie z poradnikiem 12-czynnikowym , a jeden z punktów mówi, że dzienniki aplikacji powinny być drukowane na stdout / stderr: wtedy oprogramowanie klastrowe może je zebrać.
Jednak aplikacja może zapisywać tylko do plików lub syslog. Jak zamiast tego wydrukować te dzienniki?
Odpowiedzi:
Niesamowity przepis znajduje się w pliku dokowanym nginx :
Po prostu aplikacja może kontynuować zapisywanie do niej jako plik, ale w rezultacie wiersze przejdą do
stdout
&stderr
!źródło
squid3
, a następnie ma problem z uprawnieniami na/dev/stdout
.W innym pytaniu: Zabij proces potomny, gdy rodzic wyjdzie , otrzymałem odpowiedź, która pomogła rozwiązać ten problem.
W ten sposób konfigurujemy aplikację, aby logowała się do pliku i ciągle
tail -f
go zapisywała . Na szczęścietail
może zaakceptować--pid PID
: zakończy działanie po zakończeniu określonego procesu. Umieszczamy$$
tam: PID bieżącej powłoki.Ostatnim krokiem jest uruchomienie uruchomionej aplikacji
exec
, co oznacza, że bieżąca powłoka została całkowicie zastąpiona przez tę aplikację.Skrypt runner
run.sh
będzie wyglądał następująco:UWAGA: korzystając z
tail -F
listy nazw plików, odczytamy je, nawet jeśli pojawią się później!Wreszcie minimalistyczny plik Docker:
Uwaga: aby obejść bardzo dziwne
tail -f
zachowanie (które mówi „został zastąpiony plikiem zdalnym. Rezygnacja z tej nazwy”) wypróbowałem inne podejście: wszystkie znane pliki dziennika są tworzone i obcinane przy uruchamianiu: w ten sposób upewniam się, że istnieją i tylko wtedy - ogonić je:źródło
tail
bez opcji --pid.Do procesu w tle w kontenerze dokera, np. Połączenia z exec do / bin / bash, mogłem użyć.
To wysyła dane wyjściowe do wyjścia standardowego pid 1, który jest podniesieniem jednego dokera.
źródło
docker logs
lubkubectl logs
. Mam kontener, który planuje zadanie przez crontab, który nie działa jako PID1.dla nginx możesz
nginx.conf
wskazać/dev/stderr
i/dev/stdout
polubić toi twój
Dockerfile
wpis powinien byćźródło
root