Разница здесь в том, как журналы доходят до systemd-journald
до их регистрации.
На данный момент поддерживаемые транспорты (по крайней мере, в соответствии с полем _TRANSPORT
в systemd-journald
) являются: аудит, драйвер, системный журнал, журнал, стандартный вывод и ядро (см. systemd.journal-fields (7) ).
В в вашем случае все, что записывается в stdout
командами, выполняемыми директивами ExecStart=
и ExecStop=
, регистрируется в транспорте _TRANSPORT=stdout
.
Однако Docker внутренне может использовать драйвер журналирования journald , который, помимо прочего, вводит несколько пользовательских полей журнала - одно из них CONTAINER_ID=
. Это просто другой способ доставки данных в systemd-journald
- вместо того, чтобы полагаться на systemd для перехвата и отправки всего от стандартного вывода на systemd-journald
, Docker внутренне отправляет все прямо на systemd-journald
.
Это может быть достигнуто с помощью sd-journal
API (как описано в sd-journal (3) ). Docker использует привязки go -systemd Go для библиотеки sd-journal
C.
Простой пример:
hello.c
#include <stdio.h>
#include <systemd/sd-journal.h>
int main(void)
{
printf("Hello from stdout\n");
sd_journal_print(LOG_INFO, "Hello from journald");
return 0;
}
# gcc -o /var/tmp/hello -lsystemd hello.c
# cat > /etc/systemd/system/hello.service << EOF
[Service]
ExecStart=/var/tmp/hello
EOF
# systemctl daemon-reload
# systemctl start test.service
Теперь, если я проверю журнал, я увижу оба сообщения:
# journalctl -u hello.service
-- Logs begin at Mon 2019-09-30 22:08:02 CEST, end at Fri 2020-03-27 17:11:29 CET. --
Mar 27 17:08:28 localhost systemd[1]: Started hello.service.
Mar 27 17:08:28 localhost hello[921852]: Hello from journald
Mar 27 17:08:28 localhost hello[921852]: Hello from stdout
Mar 27 17:08:28 localhost systemd[1]: hello.service: Succeeded.
Но каждое из них прибыло с использованием другого транспорта:
# journalctl -u hello.service _TRANSPORT=stdout
-- Logs begin at Mon 2019-09-30 22:08:02 CEST, end at Fri 2020-03-27 17:12:29 CET. --
Mar 27 17:08:28 localhost hello[921852]: Hello from stdout
# journalctl -u hello.service _TRANSPORT=journal
-- Logs begin at Mon 2019-09-30 22:08:02 CEST, end at Fri 2020-03-27 17:12:29 CET. --
Mar 27 17:08:28 localhost systemd[1]: Started hello.service.
Mar 27 17:08:28 localhost hello[921852]: Hello from journald
Mar 27 17:08:28 localhost systemd[1]: hello.service: Succeeded.