Журналы не отправляются в AWS Cloudwatch, когда докер отключен или находится на переднем плане

Когда я запускаю скрипт докера в интерактивном режиме, он работает. Я вижу журналы в консоли, а также в журналах AWS CloudWatch. Приведенный ниже скрипт докера работает в интерактивном режиме, и я добавил конфигурацию awslogs, чтобы журналы переходили в cloudwatch. конфигурация docker awslogs

docker run --rm -i -t  --log-driver awslogs \
    --log-opt awslogs-region=us-east-1 \
    --log-opt awslogs-group=falcoint \
    --log-opt awslogs-create-group=true \
    --privileged \
    -v /dev:/host/dev \
    -v /proc:/host/proc:ro \
    -v /boot:/host/boot:ro \
    -v /lib/modules:/host/lib/modules:ro \
    -v /usr:/host/usr:ro \
    -v /etc:/host/etc:ro \
    falcosecurity/falco:latest

Но как только я запускаю в -d автономном режиме, ни один из журналов не попадает в aws cloudwatch

docker run --rm -d --log-driver awslogs \
    --log-opt awslogs-region=us-east-1 \
    --log-opt awslogs-group=falcoint \
    --log-opt awslogs-create-group=true \
    --privileged \
    -v /dev:/host/dev \
    -v /proc:/host/proc:ro \
    -v /boot:/host/boot:ro \
    -v /lib/modules:/host/lib/modules:ro \
    -v /usr:/host/usr:ro \
    -v /etc:/host/etc:ro \
    falcosecurity/falco:latest

Когда я запускаю тот же сценарий в режиме переднего плана, то есть без -it или -d, журналы также не отправляются в cloudwatch. Но все данные буферизуются и отправляются при остановке докера falco.

docker run --rm --log-driver awslogs \
    --log-opt awslogs-region=us-east-1 \
    --log-opt awslogs-group=falcoint \
    --log-opt awslogs-create-group=true \
    --privileged \
    -v /dev:/host/dev \
    -v /proc:/host/proc:ro \
    -v /boot:/host/boot:ro \
    -v /lib/modules:/host/lib/modules:ro \
    -v /usr:/host/usr:ro \
    -v /etc:/host/etc:ro \
    falcosecurity/falco:latest

Когда докер Falco остановлен, он записывает в журнал следующее. В идеале журналы с "Файлом ошибок, созданным ниже..." должны поступать в CloudWatch Logs без необходимости останавливать контейнер.

2020-06-04T02:33:44+0000: SIGINT received, exiting...
Syscall event drop monitoring:
   - event drop detected: 0 occurrences
   - num times actions taken: 0
2020-06-04T02:32:32.495581404+0000: Notice A shell was spawned in a container with an attached terminal (user=root <NA> (id=01ca7b2306b5) shell=sh parent=runc cmdline=sh terminal=34816 container_id=01ca7b2306b5 image=<NA>)
2020-06-04T02:33:00.014981252+0000: Error File created below /dev by untrusted program (user=root command=touch /dev/rootkit2 file=/dev/rootkit2 container_id=01ca7b2306b5 image=<NA>)
2020-06-04T02:33:30.226554205+0000: Error File created below /dev by untrusted program (user=root command=touch /dev/rootkit3 file=/dev/rootkit3 container_id=01ca7b2306b5 image=<NA>)
Events detected: 3
Rule counts by severity:
   ERROR: 2
   NOTICE: 1
Triggered rules by rule name:
   Terminal shell in container: 1
   Create files below dev: 2

Чтобы устранить проблемы, запустите один из вышеуказанных и другой терминал.

docker run -it node:8-alpine sh

затем войдите в контейнер и запустите

touch /dev/rootkit

ОБНОВИТЬ:

Я заметил, что когда я запускаю докер с -d -t Logs, чтобы перейти к журналам aws Cloudwatch. Есть идеи, почему это происходит?

1 ответ

Решение

По умолчанию Docker использует драйвер json-файла, который записывает журналы в формате JSON в файл для конкретного контейнера на хосте, на котором работает контейнер. Обратитесь к этому журналу докеров

Параметр -t назначает псевдотерминал, через который основной процесс докера выводит журналы на виртуальный терминал. А драйвер журнала aws ищет tty для записи журналов. Посмотрите, как работает опция -t, и конкретно ответьте на номер 3 в этом посте.

Другие вопросы по тегам