---
title: Use containers for Java development
linkTitle: Develop your app
weight: 20
keywords: Java, local, development, run,
description: Learn how to develop your application locally.
aliases:
- /language/java/develop/
- /guides/language/java/develop/
---
## Prerequisites
Work through the steps to containerize your application in [Containerize your app](containerize.md).
## Overview
In this section, you’ll walk through setting up a local development environment
for the application you containerized in the previous section. This includes:
- Adding a local database and persisting data
- Creating a development container to connect a debugger
- Configuring Compose to automatically update your running Compose services as
you edit and save your code
## Add a local database and persist data
You can use containers to set up local services, like a database. In this section, you'll update the `docker-compose.yaml` file to define a database service and a volume to persist data. Also, this particular application uses a system property to define the database type, so you'll need to update the `Dockerfile` to pass in the system property when starting the app.
In the cloned repository's directory, open the `docker-compose.yaml` file in an IDE or text editor. Your Compose file has an example database service, but it'll require a few changes for your unique app.
In the `docker-compose.yaml` file, you need to do the following:
- Uncomment all of the database instructions. You'll now use a database service
instead of local storage for the data.
- Remove the top-level `secrets` element as well as the element inside the `db`
service. This example uses the environment variable for the password rather than secrets.
- Remove the `user` element from the `db` service. This example specifies the
user in the environment variable.
- Update the database environment variables. These are defined by the Postgres
image. For more details, see the
[Postgres Official Docker Image](https://hub.docker.com/_/postgres).
- Update the healthcheck test for the `db` service and specify the user. By
default, the healthcheck uses the root user instead of the `petclinic` user
you defined.
- Add the database URL as an environment variable in the `server` service. This
overrides the default value defined in
`spring-petclinic/src/main/resources/application-postgres.properties`.
The following is the updated `docker-compose.yaml` file. All comments have been removed.
```yaml {hl_lines="7-29"}
services:
server:
build:
context: .
ports:
- 8080:8080
depends_on:
db:
condition: service_healthy
environment:
- POSTGRES_URL=jdbc:postgresql://db:5432/petclinic
db:
image: postgres
restart: always
volumes:
- db-data:/var/lib/postgresql/data
environment:
- POSTGRES_DB=petclinic
- POSTGRES_USER=petclinic
- POSTGRES_PASSWORD=petclinic
ports:
- 5432:5432
healthcheck:
test: ["CMD", "pg_isready", "-U", "petclinic"]
interval: 10s
timeout: 5s
retries: 5
volumes:
db-data:
```
Open the `Dockerfile` in an IDE or text editor. In the `ENTRYPOINT` instruction,
update the instruction to pass in the system property as specified in the
`spring-petclinic/src/resources/db/postgres/petclinic_db_setup_postgres.txt`
file.
```diff
- ENTRYPOINT [ "java", "org.springframework.boot.loader.launch.JarLauncher" ]
+ ENTRYPOINT [ "java", "-Dspring.profiles.active=postgres", "org.springframework.boot.loader.launch.JarLauncher" ]
```
Save and close all the files.
Now, run the following `docker compose up` command to start your application.
```console
$ docker compose up --build
```
Open a browser and view the application at [http://localhost:8080](http://localhost:8080). You should see a simple app for a pet clinic. Browse around the application. Navigate to **Veterinarians** and verify that the application is connected to the database by being able to list veterinarians.