code-snippets/docs/docker/local-db-pg.md

89 lines
1.8 KiB
Markdown
Raw Normal View History

2025-02-12 10:50:06 +11:00
# Local Database With Scripts (PostgreSQL)
When developing apps locally it can be really useful to have a dockerised database unique to the application.
Often rather than just running a pre-built image, you'll want to run a database with some initial data, tables, or a schema.
For this purpose we can create our own image that extends the base image and adds our own scripts.
## Setup
For most applications the directory structure will look something like this:
```
database/
Dockerfile
scripts/
01-create-tables.sql
development/
compose.yml
src/
...
tests/
...
```
### Dockerfile
Create a dockerfile in the `database/` directory:
::: code-group
```dockerfile [Dockerfile]
FROM postgres:17
# Setup the postgres environment variables
ENV POSTGRES_USER=myuser
ENV POSTGRES_PASSWORD=mypassword
ENV POSTGRES_DB=mydatabase
# Setup port
EXPOSE 5432
# Copy all the scripts into the container
COPY ./scripts /docker-entrypoint-initdb.d/
```
:::
::: danger
As this is a local development database, we're using the a simple username and password. **Do not use this in production**.
:::
### Scripts
Create any scripts you need in the `database/scripts/` directory. PostgreSQL will run these scripts in alphabetical order against the database specified in the `POSTGRES_DB` environment variable.
::: code-group
```sql [01-create-tables.sql]
CREATE TABLE MyTable (
Id INT NOT NULL PRIMARY KEY,
Name VARCHAR(50) NOT NULL
);
```
:::
## Compose
Lastly we need to create a `docker-compose.yml` file in the `development/` directory:
::: code-group
```yaml [compose.yml]
services:
db:
build:
context: ../database
dockerfile: Dockerfile
volumes:
- db-data:/var/lib/postgresql/data
ports:
- "5432:5432"
volumes:
db-data:
```