Проблема с журналами 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
тогда мы можем увидеть журналы по
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