89 lines
1.8 KiB
Markdown
89 lines
1.8 KiB
Markdown
# 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:
|
|
``` |