Вход на хост из контейнера Docker не работает - PullRequest
0 голосов
/ 22 января 2019

У меня есть приложение на основе Microservices, и сервисы работают нормально, если я разверну их на хост-компьютере.Но теперь я хотел бы изучить Docker, поэтому я начал использовать контейнеры на компьютере с Linux.Вот пример файла Docker, он действительно прост:

  FROM openjdk:11-jdk-slim
  MAINTAINER BeszterceKK
  COPY ./tao-elszamolas-config.jar /usr/src/taoelszamolas/tao-elszamolas-config.jar
  WORKDIR /usr/src/taoelszamolas
  ENV SPRING_PROFILES_ACTIVE prod
  EXPOSE 9001
  ENTRYPOINT ["java", "-jar", "tao-elszamolas-config.jar", "-Dlog4j.configurationFile=file:/tao-elszamolas/services/tao-config/log4j2-    prod.xml", "-DlogFileLocation=/tao-elszamolas/logs"]

Моя проблема в том, что я пытаюсь записать свой журнал загрузочных приложений Spring на хост-компьютер.Вот почему я использую объемы данных.В конце команда запускает контейнер:

docker run -d --name=tao-elszamolas-config-server --publish=9001:9001 -v /tao-elszamolas/logs:/tao-elszamolas/logs -v /tao-elszamolas/services/tao-config/log4j2-prod.xml:/tao-elszamolas/services/tao-config/log4j2-prod.xml tao-elszamolas-config:latest

Но в более долгосрочной перспективе все службы перейдут в "docker-compose".Это только для теста, что-то вроде подтверждения концепции.

Первый вопрос: почему он не записывает журнал в нужное место?(В одном из определенных томов.) Это то, что я установил в XML-файле конфигурации Log4j2.Если я использую конфигурационный XML на локальном компьютере без Docker, все работает нормально.Когда я вхожу в контейнер, я вижу смонтированные тома и могу «CD» войти в него.И я также могу сделать это:

touch something.txt

Таким образом, файл будет создан и его можно увидеть как с контейнера, так и с хост-машины.Что я делаю неправильно?Я думаю, что приложение может выбрать конфигурацию журнала, потому что, когда я просто устанавливаю внутреннюю папку в качестве местоположения файла журнала, оно регистрирует содержимое внутри контейнера.

И я также устанавливаю разрешения длявесь том (и его дочерние элементы) до 777 временно, чтобы проверить, были ли проблемы с разрешениями.Но нет.Буду очень признателен за любую помощь!

Мой второй вопрос, есть ли какой-нибудь хороший веб-инструмент на linux, где я могу управлять своими контейнерами.Запустите их, затем остановитесь и т. Д. Я гуглил это и нашел некоторые, но не уверен, какой из них лучший и бесплатный для базовых нужд, а какой достаточно безопасный.

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Просто для того, чтобы предоставить некоторые шаги для проверки:

И Log4j, и весенняя загрузка в целом не должны знать о каких-либо вещах, связанных с докером, таких как тома, сопоставленные папки и т. Д.

Вместо этого настройте ведение журнала приложения так, как будто оно вообще работает без докера, поэтому, если вам нужен локальный файл - убедитесь, что приложение действительно создает файл журнала в папке по вашему выбору.

Следующим шагом будет сопоставление папки с томами в docker / docker-compose.Но сначала, пожалуйста, проверьте первый шаг:

docker ps // to see the container id
docker exec -it <CONTAINER_ID> bash
// now check the logging file from within the docker container itself even without volumes

Если файл журнала не существует, это проблема Java, и вы должны правильно настроить регистрацию.Если нет - это проблема с докером.

0 голосов
/ 24 января 2019

UPDATE:

удалось решить эту проблему, проведя пару ночей с этим.

У меня было несколько проблем. Прежде всего, порядок системных свойств в разделе ENTRYPOINT Dockerfile был не совсем правильным.

-Dsomething=something

должно быть перед "-jar". В противном случае он не работает в Docker. Я не нашел никакой официальной документации, подтверждающей это, но вот как это работает для меня. Таким образом, правильное определение ENDPOINT выглядит так:

ENTRYPOINT ["java", "-DlogFileLocation=/tao-elszamolas/logs", "-jar", "tao-elszamolas-config.jar"]

Во-вторых, когда я смонтировал несколько папок в контейнере с помощью команды docker run, например:

-v /tao-elszamolas/logs:/tao-elszamolas/logs

тогда файл журнала не был записан, если папка в контейнере Docker не существует по умолчанию. Но если я создам эту папку в какой-то момент до ENTRYPOINT в Dockerfile, то запись в журнал будет в порядке, система записывает свои журналы на хост-машину. Я также не нашел никаких документов, подтверждающих эти факты, но это мой опыт.

0 голосов
/ 22 января 2019

В вашей точке входа есть пробел после log4j2- и до prod.xml:

ENTRYPOINT ["java", "-jar", "tao-elszamolas-config.jar", "-Dlog4j.configurationFile=file:/tao-elszamolas/services/tao-config/log4j2-    prod.xml", "-DlogFileLocation=/tao-elszamolas/logs"]

Это может быть проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...