无法在我的 Spring 引导应用程序中 运行 docker-compose.yml(引发图像问题)

Cannot run docker-compose.yml (throw image issues) in my Spring Boot App

我的 Spring 启动应用程序中有一个关于 运行ning docker-compose.yml 的问题。 当我 运行 这个命令 (docker-compose up -d) 时,图像部分出现问题。

我试图解决这个问题,但我做不到。 我该如何解决?

我的问题如下所示。

    com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

这是我的项目:My Project

下面是我的 docker-compose.yml。

version: '3.8'
services:
  logstash:
    image: docker.elastic.co/logstash/logstash:7.15.2
    user: root
    command: -f /etc/logstash/conf.d/
    volumes:
      - ./logstash/:/etc/logstash/conf.d/
    ports:
      - "5000:5000"
    environment:
      LS_JAVA_OPTS: "-Xmx256m -Xms256m"
    depends_on:
      - elasticsearch
  kibana:
    image: docker.elastic.co/kibana/kibana:7.15.2
    user: root
    volumes:
      - ./kibana/:/usr/share/kibana/config/
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
    entrypoint: ["./bin/kibana", "--allow-root"]
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.15.2
    user: root
    volumes:
      - ./elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      ES_JAVA_OPTS: "-Xmx256m -Xms256m"
  app:
    image: 'springbootelk:latest'
    build:
      context: .
    container_name: SpringBootElk
    depends_on:
      - db
      - logstash
    ports:
      - '8077:8077'
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/springbootexample?useSSL=false&serverTimezone=Turkey
      - SPRING_DATASOURCE_USERNAME=springexample
      - SPRING_DATASOURCE_PASSWORD=111111
      - SPRING_JPA_HIBERNATE_DDL_AUTO=update
  db:
    container_name: mysql-latest
    image: 'mysql:latest'
    ports:
      - "3306:3306"
    restart: always
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    volumes:
      - db-data:/var/lib/mysql

# Volumes
volumes:
  db-data:

有几个问题,为什么它不起作用。
第一件事 - 您的测试设置不正确。应用程序尝试在 test 阶段连接到数据库。但是在 test 阶段还没有任何 运行 容器。您可以正确设置它,或者从测试目录中删除 MainApplicationTests class,或者通过关闭测试执行,只需在 Dockerfile 中添加 -Dmaven.test.skip 作为 mvnw package 命令。之后您的图像将正确构建。
第二件事,您需要为您的应用程序允许 public 密钥检索。为此,您可以将 allowPublicKeyRetrieval=true 添加到 jdbc url。您可以在这里阅读更多相关信息:.
这些步骤将允许您的应用程序启动(至少它将解决数据库连接问题)。但是,我发现了另一个问题。您在应用程序配置中设置 context-path 等于 /api。您还为 PersonController 添加了 @RequestMapping("/api")。要访问人员列表,您需要使用以下 url:http://localhost:8077/api/api/persons。可能,这不是您想要的。要修复它,您可以从任何地方删除它。