Логи SSHd в контейнере Docker не отображаются с помощью docker logs

Вопрос или проблема

При использовании

CMD ["/usr/sbin/sshd", "-D"]

в Dockerfile, docker logs не показывает журнал:

cat > Dockerfile.stdout <<EOF
FROM alpine:latest
RUN    apk add --no-cache openssh-server \
    && mkdir /var/run/sshd \
    && ssh-keygen -A
CMD ["/usr/sbin/sshd", "-D"]
EOF

docker build -f Dockerfile.stdout -t sshd-stdout .

docker run --name sshd-stdout -d sshd-stdout

docker logs sshd-stdout
<пусто>

Docker хост – CentOS:

cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

Docker логирующий бэкенд – journald:

grep ^OPTIONS /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'

Я также пробовал использовать json в качестве логирующего бэкенда, без успеха.

Как правильно ‘продвинуть’ журналирование?


Как предложил @marioavs, ‘-e’ необходимо. Я пробовал ‘-e’ и ‘-D’, но не оба одновременно. Итак:

cat > Dockerfile.stdout <<EOF
FROM alpine:latest
RUN    apk add --no-cache openssh-server \
    && mkdir /var/run/sshd \
    && ssh-keygen -A
CMD ["/usr/sbin/sshd", "-D", "-e"]
EOF

Используйте -e командный параметр для перенаправления всех сообщений в стандартный поток ошибок (из документации sshd):

-e Записывать отладочные журналы в стандартный поток ошибок вместо системного лога.

Я нашел хороший пример в следующем Docker файле:
простой SSHD сервер на базе alpine

CMD ["/usr/sbin/sshd", "-D", "-e"]

Ответ или решение

Когда вы запускаете Docker-контейнер с SSH-сервером, используя команду CMD ["/usr/sbin/sshd", "-D"], вы можете столкнуться с проблемой, что логи SSH-сервера не отображаются при вызове docker logs. В данном ответе мы рассмотрим причины этого поведения и предложим решения для корректной передачи логов.

Проблема с логированием в Docker

По умолчанию SSH-сервер (sshd) может использовать системный журнал для записи своих логов. Однако, когда вы запускаете sshd в контейнере Docker, он работает как отдельный процесс, и, следовательно, стандартные механизмы логирования могут не работать так, как ожидается. Это связано с тем, что вывод, который вы видите в docker logs, представляет собой stdout и stderr контейнера, а не системные журналы.

Причина отсутствии логов

Разберем детально:

  1. Стандартный вывод и стандартная ошибка: По умолчанию sshd не выводит свои лог-сообщения на стандартный вывод или стандартный поток ошибок. Вместо этого они записываются в системный журнал, что объясняет, почему команда docker logs ничего не отображает.

  2. Параметр -D: Этот параметр заставляет sshd работать в "демоном" режиме, что означает, что он не завершит свою работу, пока контейнер работает. Тем не менее, для получения логов вам нужно изменить способ вывода сообщений.

Решение: Использование параметра -e

Чтобы перенаправить логи sshd на стандартный поток ошибок, вы можете добавить параметр -e в команду sshd. Он instructs sshd записывать все сообщения отладки в стандартный поток ошибок, что позволяет Docker перенаправлять этот вывод.

Пример исправленного Dockerfile:

FROM alpine:latest
RUN apk add --no-cache openssh-server \
    && mkdir /var/run/sshd \
    && ssh-keygen -A
CMD ["/usr/sbin/sshd", "-D", "-e"]

Дополнительные настройки

Вывод логов в журналы системы

Если вам необходимо сохранить возможности логирования в системе, вы можете дополнительно настроить параметры конфигурации SSH. Например, отредактировать файл /etc/ssh/sshd_config и добавить:

LogLevel VERBOSE

Это позволит вам получать более подробные логи системы, что может быть полезно для диагностики.

Заключение

Для получения логов sshd в Docker-контейнере необходимо использовать параметр -e. Это простое изменение позволит вам видеть вывод логов, записанных sshd, в консоли Docker через команду docker logs. С вышеописанными настройками вы сможете эффективно управлять логами вашего SSH-сервера, что повысит производительность вашей работы и упростит диагностику возможных проблем.

Если после всех изменений логи все еще не отображаются, проверьте конфигурацию вашего Docker и убедитесь, что используется нужный драйвер логирования. В случае работы с journald также убедитесь, что права доступа и настройки конфигурации соответствуют требованиям для записи логов.

Если у вас есть другие вопросы или требуется дополнительная помощь, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...