如何使用docker-compose连接到PostgreSQL?

20

想要使用 docker-compose 同时运行 API 应用程序和 PostgreSQL 数据库。

docker-compose 文件:

version: '3'

volumes:
  database_data:
    driver: local

services:
  db:
    image: postgres:latest
    volumes:
      - database_data:/var/lib/postgresql/data

  api:
    build: ./api
    expose:
      - 8080
    ports:
      - 8080:8080
    volumes:
      - ./api:/usr/src/app/
    links:
      - db
    environment:
      - PGHOST=db
      - PGDATABASE=postgres
      - PGUSER=postgres

API main.go 文件:

func main() {
    db, err = gorm.Open("postgres", "host=db port=5432 user=postgres dbname=postgres")
  // ...
}

运行服务时,从日志中收到以下消息:

api_1     | [GIN] 2018/06/22 - 07:31:10 | 404 |      1.4404ms |      172.20.0.1 | GET      /posts
api_1     |
api_1     | (sql: database is closed)
api_1     | [2018-06-22 07:31:10]
api_1     |
api_1     | (sql: database is closed)
api_1     | [2018-06-22 07:31:10]
api_1     | [GIN] 2018/06/22 - 07:32:14 | 403 |        15.6µs |      172.20.0.1 | GET      /posts
db_1      | 2018-06-22 07:34:27.296 UTC [81] FATAL:  role "root" does not exist
db_1      | 2018-06-22 07:34:36.897 UTC [90] FATAL:  role "root" does not exist

这种方式不好吗?连接字符串中使用host=db,因为db是Docker Compose服务名称。


补充

它可以正常工作:

https://docs.docker.com/samples/library/postgres/#-or-via-psql


1
看起来你需要暴露Postgres的端口。 - Dominic Barnes
你尝试过添加 network_mode: host 吗? - Alejandro Galera
@mulg0r 不是,怎么添加它? - v v
我在这里看到两件事情:(1)修复您从db获取的FATAL错误,(2)确保apidb准备就绪后尝试连接。 - tgogos
即使Postgres正在监听该端口,也不意味着Docker会通过该端口发送流量。您需要将 ports: - 5432:5432 添加到您的Docker Compose配置中,因为默认情况下所有端口都是关闭的。 - Dominic Barnes
显示剩余2条评论
1个回答

29
在您提供的链接中,有些配置设置是您未添加的。
restart: always
environment:
  POSTGRES_PASSWORD: example

你应该尝试这个

version: '3'

services:
  db:
    image: postgres:latest
    restart: always
    ports:
      - 5432:5432
    environment:
      POSTGRES_PASSWORD: 'postgres'
    volumes:
      - database_data:/var/lib/postgresql/data

  api:
    build: ./api
    expose:
      - 8080
    ports:
      - 8080:8080
    volumes:
      - ./api:/usr/src/app/
    links:
      - db
    environment:
      - PGHOST: 'db'
      - PGDATABASE: 'postgres'
      - PGUSER: 'postgres'
      - PGPASSWORD: 'postgres'


volumes:
  database_data:
    driver: local

db, err := gorm.Open("postgres", "host=db port=5432 user=postgres dbname=postgres password=postgres")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接