API приложения Dockerized Spring Boot недоступен

#spring-boot #docker

Вопрос:

Я столкнулся с досадной проблемой, и, надеюсь, кто-нибудь сможет мне подсказать.

Я написал приложение Spring Boot, которое работает локально (не в Docker), затем у меня есть Кафка и Zookeeper в контейнерах Docker. Связь работает идеально.

Теперь я закрепил приложение Spring Boot, и когда я пытаюсь его вызвать (http://localhost:8080/kafka/health-check) с главного ноутбука я получаю 404.

Класс Java:

 @org.springframework.web.bind.annotation.RestController @RequestMapping("kafka") public class RestController {  (...)  @GetMapping("health-check")  public ResponseEntitylt;Objectgt; healtCheck() {  return ResponseEntity.ok().build();  } }  

Файл Docker предоставляет порт:

 FROM openjdk:11 EXPOSE 8080 ADD target/spring-boot-kafka-producer-example-0.0.1-SNAPSHOT.jar app.jar ENTRYPOINT ["java", "-jar", "app.jar"]  

Докер тоже сочиняет:

 services:  zookeper:  image: wurstmeister/zookeeper  container_name: zookeeper  ports:  - "2181:2181"  kafka:  image: wurstmeister/kafka  container_name: kafka  ports:  - "9092:9092"  environment:  KAFKA_ADVERTISED_HOST_NAME: localhost  # Connect to Zookeper  KAFKA_ZOOKEEPER_CONNECT: zookeper:2181  spring-boot-app:  image: spring-boot-app  container_name: spring-boot-app  ports:  - "8080:8080"  

Я все еще получаю 404, даже когда бегу:

 docker exec -it spring-boot-app curl spring-boot-app:8080/kafka/health-check  

Я не могу вызвать API ни извне Docker, ни внутри контейнера Docker, поэтому, должно быть, мне где-то не хватает чего-то небольшого.

Комментарии:

1. Вы проверили журналы приложения, чтобы убедиться, что оно запущено?

2. Он работает так, что нет никаких журналов о неудачном запросе @SoftwareEngineer

3. Возможно, вы захотите установить netstat в контейнер и проверить, действительно ли 8080 открыт.

4. @atline Это не объясняет, почему завиток не работает. Правильно ли я его выполняю?

5. ДА, это не объясняет, просто хочу подтвердить , действительно ли порт 8080 открыт вами java -jar app.jar , просто чтобы сузиться …

Ответ №1:

Проблема заключалась в том, что банка не была современной. По какой-то причине IntelliJ выполнит приложение, но не создаст jar. Проблема была решена бегом mvn clean install

Комментарии:

1. Не пишите свой собственный файл Dockerfile… И особенно не используйте жирные банки в Докере. mvn spring-boot:build-image создаст (оптимизированное) изображение для вас без какого-либо файла Dockerfile

2. @OneCricketeer Почему я не должен писать свой док-файл? Это всего лишь тестовый проект….

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