I have written a github action that runs tests in a docker container. Sometimes users of that action will want to connect to a database for the tests, I would expect they could just use a postgres service to do so, but currently I cannot get that to work.
name: On Prs on: [pull_request] jobs: run_tests: runs-on: ubuntu-latest services: postgres: image: postgres:11-alpine env: POSTGRES_USER: monster POSTGRES_PASSWORD: monster ports: - "54321:5432" # needed because the postgres container does not provide a healthcheck options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 10 steps: - uses: actions/checkout@v2 - name: "run dem tests" uses: Adzzemail@example.com
The app is correctly configured to listen port 54321 and the db user and password are configured correctly to both be monster. Is there something obvious I am missing??
The error is:
(DBConnection.ConnectionError) tcp connect (postgres:54321): connection refused - :econnrefused
Hi @Adzz ,
Thank you for being here!
From your code 'ports: - "54321:5432"', you are mapping TCP port 5432 in the container to port 54321 on the Docker host. I don't have your exact code, so if your app is listening port on host runner, it should be '54321' port.
But since you're using a github container action to communicate with postgres service, as doc mentioned:
your step uses container actions, you don't need to map ports to access the service or action. Docker automatically exposes all ports between containers on the same Docker user-defined bridge network. You can directly reference the service container by its hostname. The hostname is automatically mapped to the label name you configure for the service in the workflow.
You should not need to listen to the port but reference its hostname/label name directly.
Thanks for the response, that was a typo my App was configured to listen to 54321, so it should have been working.
If i drop the port mapping how will it know what port my app is configured to listen to? Indeed if i do that it (predictably) doesn't connect to the database.