mirror of https://github.com/docker/docs.git
223 lines
5.9 KiB
Markdown
223 lines
5.9 KiB
Markdown
---
|
|
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.
|