Вопрос или проблема
При использовании
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
контейнера, а не системные журналы.
Причина отсутствии логов
Разберем детально:
-
Стандартный вывод и стандартная ошибка: По умолчанию sshd не выводит свои лог-сообщения на стандартный вывод или стандартный поток ошибок. Вместо этого они записываются в системный журнал, что объясняет, почему команда
docker logs
ничего не отображает. -
Параметр -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 также убедитесь, что права доступа и настройки конфигурации соответствуют требованиям для записи логов.
Если у вас есть другие вопросы или требуется дополнительная помощь, не стесняйтесь обращаться!