我有一个Java Spring启动应用程序,可以与Postgres数据库一起使用.我想用Docker来处理这两个问题.我最初只把Postgres放在Docker中,我有一个docker-compose.yml文件,定义如下:

version: '2'
services:
    db:
        container_name: sample_db
        image: postgres:9.5
        volumes:
            - sample_db:/var/lib/postgresql/data
        environment:
            - POSTGRES_PASSWORD=sample
            - POSTGRES_USER=sample
            - POSTGRES_DB=sample
            - PGDATA=/var/lib/postgresql/data/pgdata
        ports:
            - 5432:5432

volumes:
    sample_db: {}

然后,当我发出命令sudo dockerdsudo docker-compose -f docker-compose.yml up时,它正在启动数据库.例如,我可以使用pgAdmin连接,使用localhost作为服务器和端口5432.然后,在我的Spring Boot应用程序中,在application.properties文件中,我定义了以下属性.

spring.datasource.url=jdbc:postgresql://localhost:5432/sample
spring.datasource.username=sample
spring.datasource.password=sample
spring.jpa.generate-ddl=true

此时,我可以通过Spring Suite在本地运行我的Spring Boot应用程序,一切正常.然后,我还想将我的Spring Boot应用程序添加为Docker image.首先,我在我的项目目录中创建了一个Dockerfile,如下所示:

FROM java:8
EXPOSE 8080
ADD /target/manager.jar manager.jar
ENTRYPOINT ["java","-jar","manager.jar"]

然后,我进入了发布mvn clean的项目目录,接着是mvn install.接下来是docker build -f Dockerfile -t manager .,后面是docker tag 9c6b1e3f1d5e myuser/manager:latest(id是正确的).最后,我对现有的docker-compose.yml文件进行了如下编辑:

version: '2'
services:
    web:
      image: myuser/manager:latest
      ports: 
          - 8080:8080
      depends_on:
          - db
    db:
        container_name: sample_db
        image: postgres:9.5
        volumes:
            - sample_db:/var/lib/postgresql/data
        environment:
            - POSTGRES_PASSWORD=sample
            - POSTGRES_USER=sample
            - POSTGRES_DB=sample
            - PGDATA=/var/lib/postgresql/data/pgdata
        ports:
            - 5432:5432

volumes:
    sample_db: {}

但是,现在如果我发出sudo docker-compose -f docker-compose.yml up命令,数据库会再次正确启动,但我会得到错误,并退出web应用程序部分的代码1.问题在于连接字符串.我相信我必须把它换成别的东西,但我不知道它应该是什么.我收到以下错误消息:

web_1  | 2017-06-27 22:11:54.418 ERROR 1 --- [           main] o.a.tomcat.jdbc.pool.ConnectionPool      : Unable to create initial connections of pool.
web_1  | 
web_1  | org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections

有什么 idea 吗?

推荐答案

每个容器都有自己的网络接口和本地主机.因此,改变Java指向Postgres的方式:

spring.datasource.url=jdbc:postgresql://localhost:5432/sample

致:

spring.datasource.url=jdbc:postgresql://db:5432/sample

db将解析为正确的Postgres IP.


prize 有了docker compose,你不需要手工打造自己的形象.所以改变:

web:
  image: myuser/manager:latest

致:

web:
  build: .

Postgresql相关问答推荐

Redis作为postgreSQL嵌套数据的缓存

如何获取实例化视图的列级权限?

为什么在PostgreSQL中CPU_INDEX_TUPLE_COST与CPU_TUPLE_COST不同

数组格式类型的PostgreSQL日期

如何重新格式化已获取的 psql 查询输出?

Postgres 函数 now() 返回不正确的时区偏移量

如何使 Postgres 优化引擎具有确定性

从 PostgreSQL 中的每个组中抽取 N 个样本

在 jOOQ 中 Select 相同的命名列

是否可以在 postgresql 中添加表元数据?

psql中set、\set和\pset的区别

并发刷新materialized视图

从 psycopg2 异常中获取错误消息

Redis 可以写出到像 PostgreSQL 这样的数据库吗?

防止 CHARACTER VARYING 字段中出现空字符串

PostgreSQL 获取过go 12 小时的元素

如何使用 WITH RECURSIVE 子句进行 Select

psql 致命角色不存在

PostgreSQL 字符串(255) 限制 - Rails、Ruby 和 Heroku

PostgreSQL - 必须出现在 GROUP BY 子句中或在聚合函数中使用