tekun
tekun

Reputation: 71

Can not connect to the container based on postgres

I am new to docker container. I am trying to unit test my Flask application on Circle CI automatically. However it can not connect to postgres container. It works in my local computer (macOS Sierra). Let me know if you need more information to solve this issue. Thank you!!

docker-compose.yml

version: '3'
services:
  web:
    container_name: web
    build: ./web
    ports:
      - "5000:5000"
    depends_on:
      - postgres
    volumes:
      - ./web/.:/app
    tty: true

  postgres:
    container_name: postgres
    build: ./db
    ports:
      - "5432:5432"

config.yml

version: 2
jobs:
  build:
    machine: true

    working_directory: ~/repo

    steps:
      - checkout

      - run:
          name: Install Docker Compose
          command: |
            sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
            sudo chmod +x /usr/local/bin/docker-compose

      - run:
          name: Start container and veryfy it's working
          command: |
            set -x
            cd ~/repo/docker
            docker-compose up --build -d
      - run:
          name: Run test
          command: |
            cd ~/repo/docker
            docker-compose run web python tests/test_therapies.py

Circle Ci build log

    connection = pool._invoke_creator(self)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/strategies.py", line 105, in connect
    return dialect.connect(*cargs, **cparams)
  File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 393, in connect
    return self.dbapi.connect(*cargs, **cparams)
  File "/usr/local/lib/python3.6/site-packages/psycopg2/__init__.py", line 130, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: Connection refused
    Is the server running on host "postgres" (172.18.0.2) and accepting
    TCP/IP connections on port 5432?


----------------------------------------------------------------------
Ran 1 test in 0.025s

FAILED (errors=1)
    Exited with code 1

Upvotes: 0

Views: 1050

Answers (1)

grizzthedj
grizzthedj

Reputation: 7505

I think the problem is that the postgres service is not fully up when your web app starts. Based on your comment about it working after adding the sleep timer, it seems this is the problem.

You can run a container called dadarek/wait-for-dependencies as a mechanism to wait for services to be up(in your case, postgres).

Here is how you can implement it:

1). Add a new service to your docker-compose.yml

  waitfordb:
    image: dadarek/wait-for-dependencies
    depends_on:
      - postgres 
    command: postgres:5432

Your docker-compose.yml should look now look like this:

version: '3'
services:
  waitfordb:
    image: dadarek/wait-for-dependencies
    depends_on:
      - postgres 
    command: postgres:5432

  web:
    container_name: web
    build: ./web
    ports:
      - "5000:5000"
    depends_on:
      - waitfordb
      - postgres
    volumes:
      - ./web/.:/app
    tty: true

  postgres:
    container_name: postgres
    build: ./db
    ports:
      - "5432:5432"

2). Startup compose

docker-compose run --rm waitfordb
docker-compose up -d web postgres

The result is that your web service should now wait for port 5432 to be up in your postgres container, before trying to start up.

Upvotes: 3

Related Questions