21

Want to use docker-compose to run api application and postgresql database together.

docker-compose file:

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 file:

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

When run the services, got message from log:

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

Does this way not good? host=db in the connection string? Since db is the docker compose service name.


Add

It can work:

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

7
  • 1
    Looks like you need to expose the port for postgres Commented Jun 22, 2018 at 8:01
  • @DominicBarnes It doesn't matter: db_1 | 2018-06-22 08:43:58.702 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432. Commented Jun 22, 2018 at 8:45
  • have you trying adding network_mode: host? Commented Jun 22, 2018 at 8:56
  • @mulg0r No, how to add it? Commented Jun 22, 2018 at 9:03
  • I see 2 things here: (1) fix the FATAL errors you get from your db, (2) make sure that api will try to connect after db is ready. Commented Jun 22, 2018 at 9:07

1 Answer 1

31

In the link you provided there are configuration settings that you did not added

restart: always
environment:
  POSTGRES_PASSWORD: example

You should try this

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

and

db, err := gorm.Open("postgres", "host=db port=5432 user=postgres dbname=postgres password=postgres")
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.