Skip to content
Latchkey

How to Run a Postgres Service in a Jenkins Pipeline

Jenkins runs sidecar services with the Docker Pipeline plugin's docker.image().withRun, which starts and links a container around your steps.

Use the Docker Pipeline plugin's sidecar pattern: withRun starts a container, gives you its handle, and tears it down when the block exits.

Postgres sidecar

Start Postgres, wait for it, run tests against it, then it is automatically removed.

Jenkinsfile
pipeline {
  agent any
  stages {
    stage('Test') {
      steps {
        script {
          docker.image('postgres:16').withRun(
            '-e POSTGRES_PASSWORD=postgres -p 5432:5432'
          ) { c ->
            sh 'until pg_isready -h localhost -p 5432; do sleep 1; done'
            withEnv(['DATABASE_URL=postgres://postgres:postgres@localhost:5432/postgres']) {
              sh 'npm ci && npm test'
            }
          }
        }
      }
    }
  }
}

Gotchas

  • Requires the Docker Pipeline plugin and a Docker daemon on the agent.
  • Wait for the DB to accept connections (pg_isready loop) before connecting - withRun returns as soon as the container starts.
  • If your build runs inside a container, link via the inner network alias instead of localhost.

Related guides

Run this faster and cheaper on Latchkey managed runners. Start free →