--- title: Use containers for R development linkTitle: Develop your app weight: 20 keywords: R, local, development description: Learn how to develop your R application locally. aliases: - /language/r/develop/ - /guides/language/r/develop/ --- ## Prerequisites Complete [Containerize a R application](containerize.md). ## Overview In this section, you'll learn how to set up a development environment for your containerized application. This includes: - Adding a local database and persisting data - Configuring Compose to automatically update your running Compose services as you edit and save your code ## Get the sample application You'll need to clone a new repository to get a sample application that includes logic to connect to the database. Change to a directory where you want to clone the repository and run the following command. ```console $ git clone https://github.com/mfranzon/r-docker-dev.git ``` ## Configure the application to use the database To try the connection between the Shiny application and the local database you have to modify the `Dockerfile` changing the `COPY` instruction: ```diff -COPY src/ . +COPY src_db/ . ``` ## 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 `compose.yaml` file to define a database service and a volume to persist data. In the cloned repository's directory, open the `compose.yaml` file in an IDE or text editor. In the `compose.yaml` file, you need to un-comment the properties for configuring the database. You must also mount the database password file and set an environment variable on the `shiny-app` service pointing to the location of the file in the container. The following is the updated `compose.yaml` file. ```yaml services: shiny-app: build: context: . dockerfile: Dockerfile ports: - 3838:3838 environment: - POSTGRES_PASSWORD_FILE=/run/secrets/db-password depends_on: db: condition: service_healthy secrets: - db-password db: image: postgres restart: always user: postgres secrets: - db-password volumes: - db-data:/var/lib/postgresql/data environment: - POSTGRES_DB=example - POSTGRES_PASSWORD_FILE=/run/secrets/db-password expose: - 5432 healthcheck: test: ["CMD", "pg_isready"] interval: 10s timeout: 5s retries: 5 volumes: db-data: secrets: db-password: file: db/password.txt ``` > [!NOTE] > > To learn more about the instructions in the Compose file, see [Compose file > reference](/reference/compose-file/). Before you run the application using Compose, notice that this Compose file specifies a `password.txt` file to hold the database's password. You must create this file as it's not included in the source repository. In the cloned repository's directory, create a new directory named `db` and inside that directory create a file named `password.txt` that contains the password for the database. Using your favorite IDE or text editor, add the following contents to the `password.txt` file. ```text mysecretpassword ``` Save and close the `password.txt` file. You should now have the following contents in your `r-docker-dev` directory. ```text ├── r-docker-dev/ │ ├── db/ │ │ └── password.txt │ ├── src/ │ │ └── app.R │ ├── src_db/ │ │ └── app_db.R │ ├── requirements.txt │ ├── .dockerignore │ ├── compose.yaml │ ├── Dockerfile │ ├── README.Docker.md │ └── README.md ``` Now, run the following `docker compose up` command to start your application. ```console $ docker compose up --build ``` Now test your DB connection opening a browser at: ```console http://localhost:3838 ``` You should see a pop-up message: ```text DB CONNECTED ``` Press `ctrl+c` in the terminal to stop your application. ## Automatically update services Use Compose Watch to automatically update your running Compose services as you edit and save your code. For more details about Compose Watch, see [Use Compose Watch](/manuals/compose/how-tos/file-watch.md). Lines 15 to 18 in the `compose.yaml` file contain properties that trigger Docker to rebuild the image when a file in the current working directory is changed: ```yaml {hl_lines="15-18",linenos=true} services: shiny-app: build: context: . dockerfile: Dockerfile ports: - 3838:3838 environment: - POSTGRES_PASSWORD_FILE=/run/secrets/db-password depends_on: db: condition: service_healthy secrets: - db-password develop: watch: - action: rebuild path: . db: image: postgres restart: always user: postgres secrets: - db-password volumes: - db-data:/var/lib/postgresql/data environment: - POSTGRES_DB=example - POSTGRES_PASSWORD_FILE=/run/secrets/db-password expose: - 5432 healthcheck: test: ["CMD", "pg_isready"] interval: 10s timeout: 5s retries: 5 volumes: db-data: secrets: db-password: file: db/password.txt ``` Run the following command to run your application with Compose Watch. ```console $ docker compose watch ``` Now, if you modify your `app.R` you will see the changes in real time without re-building the image! Press `ctrl+c` in the terminal to stop your application. ## Summary In this section, you took a look at setting up your Compose file to add a local database and persist data. You also learned how to use Compose Watch to automatically rebuild and run your container when you update your code. Related information: - [Compose file reference](/reference/compose-file/) - [Compose file watch](/manuals/compose/how-tos/file-watch.md) - [Multi-stage builds](/manuals/build/building/multi-stage.md) ## Next steps In the next section, you'll take a look at how to set up a CI/CD pipeline using GitHub Actions.