代码之家  ›  专栏  ›  技术社区  ›  Darlyn

docker compose服务无法连接到docker compose中的其他服务

  •  -1
  • Darlyn  · 技术社区  · 1 年前

    我有一个使用DB的spring boot应用程序,我定义了 docker-compose it的文件:

    services:
      my-app:
        build: .
        ports:
          - "8080:8080"
        environment:
          DB_HOST: app-db
          DB_PORT: 5434
          DB_USER: myuser
          DB_PASSWORD: mypassword
          DB_NAME: mydb
        depends_on:
          - db
        container_name: my-app
      db:
        image: postgres:13-alpine
        environment:
          POSTGRES_USER: myuser
          POSTGRES_PASSWORD: mypassword
          POSTGRES_DB: mydb
        volumes:
          - production_data:/var/lib/postgresql/data
          - ./db/create_script.sql:/docker-entrypoint-initdb.d/create_script.sql
        ports:
          - "5434:5432"
        container_name: app-db
    volumes:
      production_data:
    

    以及application.properties:

    # Database connection
    spring.datasource.url=jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_NAME}
    spring.datasource.username=${DB_USER}
    spring.datasource.password=${DB_PASSWORD}
    spring.datasource.driver-class-name=org.postgresql.Driver
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
    

    然而,当我运行docker compose时 my-app 容器因以下错误而失败:

    >      HHH000342: Could not obtain connection to query metadata
    >     java.lang.NullPointerException: Cannot invoke "org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(java.sql.SQLException,
    > String)" because the return value of
    > "org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.sqlExceptionHelper()"
    > is null
    

    这几乎意味着,如果你从中省略我的应用程序,它就无法连接到数据库 docker编写 文件,然后从中启动数据库,它就可以工作了(将DB_HOST更改为localhost)。

    这是什么原因造成的?因为它们是在docker compose中定义的,所以它们应该在同一个网络中(通过检查容器,它们确实在docker composer创建的同一网络中)

    谢谢你的帮助!

    1 回复  |  直到 1 年前
        1
  •  1
  •   larsks    1 年前

    问题是你有:

    DB_PORT: 5434
    

    但postgres正在侦听端口5432。端口发布(将容器端口映射到主机端口)不会影响容器到容器的通信;它只影响端口在主机上的暴露方式。

    如果您的后端数据库仅由您的应用程序使用,则没有理由在主机上发布数据库端口。