# Docker - Use docker-compose to initialize database

When using `docker-compose.yml` to run your application, you will need to ensure that your database is initialized before it is ready.

Although it is expected of the application to manage it’s own database migrations and  [seeding](https://blog.manoj.ch/typeorm-use-querybuilder-for-database-seeding) there maybe occasions where additional setup might be required such as enabling a database plugin, managing users and granting permissions. For such operations, using a `Dockerfile`, you would `COPY` an initialize shell script or SQL file to `/docker-entrypoint-initdb.d`. Any `.sh` or `.sql` file present there would be executed upon container start.

But while using `docker-compose.yml` to run an official database image, you can avoid creating a separate `Dockerfile` for the database by using the `volumes` parameter for the database service:

```yaml 
version: "3"
services:
  postgres:
    image: postgres
    environment:
      POSTGRES_USER: username
      POSTGRES_PASSWORD: password
      POSTGRES_DB: postgres
    volumes:
      - ./docker/init.sql:/docker-entrypoint-initdb.d/init.sql
    restart: always

```

And that’s it. Any SQL statements present in `init.sql` would be executed on container start.

>P.S.: Using `POSTGRES_USER` `POSTGRES_PASSWORD` `POSTGRES_DB` environment variables would automatically create the database and the user and also grant permissions.

>Note: Take care to append `IF NOT EXISTS` to any `CREATE` queries to avoid errors. 
