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:
|
||
|
```
|