#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
создаст (оптимизированное) изображение для вас без какого-либо файла Dockerfile2. @OneCricketeer Почему я не должен писать свой док-файл? Это всего лишь тестовый проект….
3. Как я уже сказал, Спрингбут может сделать это за вас. Это пустая трата времени, даже для тестового проекта, и это создает более оптимизированное изображение