Проблема с журналами Docker: журналы не создаются и не отображаются в папке журналов Tomcat в контейнере Docker.

Мы используем Docker-контейнер и создали Dockerfile. Внутри этого контейнера мы развернули файл war, используя образ tomcat, и можем видеть журналы tomcat на консоли, но журналы консоли не обновляются после отправки запроса на tomcat через URL. Также мы не можем увидеть какой-либо файл журнала внутри папки журналов tomcat

Может кто-нибудь помочь мне, что, как мы можем видеть журналы Tomcat, как localhost.logs/catalina.logs/manager.logs и т. Д.

МОЙ Dockerfile - это:-

FROM openjdk:6-jre

ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH

COPY tomcat $CATALINA_HOME

ADD  newui.war  $CATALINA_HOME/webapps

CMD $CATALINA_HOME/bin/startup.sh && tail -F $CATALINA_HOME/logs/catalina.out

EXPOSE 8080

Используемый ниже скрипт для сборки

$ docker build -t tomcat .

и ниже используется для запуска кота

$ docker run -p 8080:8080 tomcat

3 ответа

Вот несколько вещей, которые не так с вашим dockerfile: Вы упоминаете, что вам нужна Java 6, и все же строка FROM java на момент написания статьи установлено использование java:8.

Вам необходимо заменить строку ОТ FROM java:6-jre или как предложено на официальной странице: FROM openjdk:6-jre если в 2018 году вам все еще нужна Java 6, что опасно. Я также настоятельно рекомендую использовать хотя бы FROM tomcat:7 который должен быть в состоянии запускать апплеты java 6, но будет включать некоторые исправления ошибок, включая поддержку более длинных простых чисел Диффи-Хеллмана для HTTPS (если вы серьезно относитесь к безопасности вашего приложения).

Copt tomcat $CATALINA_HOME вы либо неправильно набрали строку SO, либо ваше изображение не должно создаваться вообще. Так должно быть COPY tomcat $CATALINA_HOME

Учитывая, что вы используете COPY Команду нет необходимости использовать RUN mkdir -p до этого, так как COPY Команда автоматически создаст все необходимые папки.

CMD $CATALINA_HOME/bin/startup.sh && tail -f $CATALINA_HOME/logs/catalina.out

Сначала tail -f часть: так как вы ищете хвост файла журнала, который может быть создан и воссоздан во время работы сервера вместо того, чтобы следовать FD, вы должны следовать по пути, выполнив tail -F (заглавная F)

startup.sh && tail - tail никогда не запустится, пока не будет запущен startup.sh. Лучше подход сделать tail -F $CATALINA_HOME/logs/catalina.out & внутри вашего startup.sh прямо перед запуском вашего сервера Tomcat. Таким образом, хвост будет работать на заднем плане.

Несмотря на это, это несколько опасный подход, и вы рискуете использовать процессы зомби, потому что bash не управляет дочерними процессами и не работает с докером. Я бы порекомендовал использовать supervisord или что-то подобное.

(Из https://docs.docker.com/engine/admin/multi-service_container/)

FROM ubuntu:latest
RUN apt-get update && apt-get install -y supervisor
RUN mkdir -p /var/log/supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY my_first_process my_first_process
COPY my_second_process my_second_process
CMD ["/usr/bin/supervisord"]

Примечание: в этом примере файла dockerfile пропущено несколько лучших практик, например, удаление кэша apt в той же команде run, что и при обновлении apt-get.

Личным фаворитом является phusion / baseimage, но его сложнее настроить, так как вам нужно установить все, включая java, в образ.


Если со всеми этими изменениями вам все еще не повезло увидеть обновление консоли, то вам также необходимо опубликовать содержимое вашего файла startup.sh или других связанных с tomcat конфигураций.

PS: это может быть хорошей идеей сделать RUN mkdir -p $CATALINA_HOME/logs просто чтобы убедиться, что папка logs существует для tomcat для записи.

PPS: базовый образ Java фактически использует openjdk вместо оракула. Просто подумал, что укажу на это

Мы не сможем увидеть логи в контейнере Docker, пока не смонтируем его. Чтобы построить Dockerfile:-

сборка докера -t tomcat .

Для запуска образа Dockerfile:-

Docker run -p 8080:8080 кот

скопировать логи tomcat, присутствующие в Docker-контейнере, в смонтированный контейнер: -

Запустите этот cmd для монтирования контейнера:

                                    1stpath    :      2ndpath

Окно запуска \-d \-p 8085:8085 \-v /usr/local/tomcat/logs:/usr/local/tomcat/logs \tomcat

или просто

Докер запустите \ -d \ -v / usr / local / tomcat / logs: / usr / local / tomcat / logs \ tomcat

1-й: - / usr / local / tomcat / logs: путь к корневому каталогу: куда мы хотим скопировать журналы или место назначения

2-й: - / usr / local / tomcat / logs: путь к папке tomcat / logs, присутствующей в докере

кот: -имя изображения

нужно сменить порт если он занят

теперь контейнер становится монтируемым

чтобы получить список запуска контейнера: docker ps -a

Теперь получите идентификатор контейнера последнего созданного контейнера:

docker exec -it bash

тогда мы можем увидеть журналы по

    cd /usr/local/tomcat/logs

    usr/local/tomcat/logs# less  Log Name Here   

Это скопировать любую папку в Docker-контейнере в корневой каталог: -

докер cp: / file / path / внутри / контейнер / хост / path / target

Вы должны проверить настройки регистрации tomcat. Параметры по умолчанию logging.properties в JRE указывают ConsoleHandler, который направляет запись в журнал System.err. По умолчанию conf / logging.properties в Apache Tomcat также добавляет несколько FileHandlers, которые записывают в файлы.

Пример файла logging.properties для размещения в $CATALINA_BASE/conf:

handlers = 1catalina.org.apache.juli.FileHandler, \
           2localhost.org.apache.juli.FileHandler, \
           3manager.org.apache.juli.FileHandler, \
           java.util.logging.ConsoleHandler

.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.

2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.

3manager.org.apache.juli.FileHandler.level = FINE
3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.FileHandler.prefix = manager.
3manager.org.apache.juli.FileHandler.bufferSize = 16384

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter


############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = \
   2localhost.org.apache.juli.FileHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = \
   3manager.org.apache.juli.FileHandler

# For example, set the org.apache.catalina.util.LifecycleBase logger to log
# each component that extends LifecycleBase changing state:
#org.apache.catalina.util.LifecycleBase.level = FINE

Пример logging.properties для веб-приложения с сервлетами-примерами для размещения в WEB-INF/classes внутри веб-приложения:

handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

org.apache.juli.FileHandler.level = FINE
org.apache.juli.FileHandler.directory = ${catalina.base}/logs
org.apache.juli.FileHandler.prefix = servlet-examples.

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

Более подробная информация на https://tomcat.apache.org/tomcat-6.0-doc/logging.html

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