⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

Utiliser des conteneurs pour le développement R

Prérequis

Terminez Conteneuriser une application R.

Aperçu

Dans cette section, vous apprendrez à mettre en place un environnement de développement pour votre application conteneurisée. Cela inclut :

  • L'ajout d'une base de données locale et la persistance des données
  • La configuration de Compose pour mettre à jour automatiquement vos services Compose en cours d'exécution lorsque vous modifiez et enregistrez votre code

Obtenir l'application exemple

Vous devrez cloner un nouveau dépôt pour obtenir une application exemple qui inclut la logique de connexion à la base de données.

Placez-vous dans un répertoire où vous souhaitez cloner le dépôt et exécutez la commande suivante.

$ git clone https://github.com/mfranzon/r-docker-dev.git

Configurer l'application pour utiliser la base de données

Pour essayer la connexion entre l'application Shiny et la base de données locale, vous devez modifier le Dockerfile en changeant l'instruction COPY :

-COPY src/ .
+COPY src_db/ .

Ajouter une base de données locale et persister les données

Vous pouvez utiliser des conteneurs pour mettre en place des services locaux, comme une base de données. Dans cette section, vous mettrez à jour le fichier compose.yaml pour définir un service de base de données et un volume pour persister les données.

Dans le répertoire du dépôt cloné, ouvrez le fichier compose.yaml dans un IDE ou un éditeur de texte.

Dans le fichier compose.yaml, vous devez dé-commenter les propriétés pour configurer la base de données. Vous devez également monter le fichier de mot de passe de la base de données et définir une variable d'environnement sur le service shiny-app pointant vers l'emplacement du fichier dans le conteneur.

Voici le fichier compose.yaml mis à jour.

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

Pour en savoir plus sur les instructions du fichier Compose, consultez la référence du fichier Compose.

Avant d'exécuter l'application à l'aide de Compose, notez que ce fichier Compose spécifie un fichier password.txt pour contenir le mot de passe de la base de données. Vous devez créer ce fichier car il n'est pas inclus dans le dépôt source.

Dans le répertoire du dépôt cloné, créez un nouveau répertoire nommé db et à l'intérieur de ce répertoire, créez un fichier nommé password.txt qui contient le mot de passe de la base de données. À l'aide de votre IDE ou éditeur de texte préféré, ajoutez le contenu suivant au fichier password.txt.

mysecretpassword

Enregistrez et fermez le fichier password.txt.

Vous devriez maintenant avoir le contenu suivant dans votre répertoire r-docker-dev.

├── 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

Maintenant, exécutez la commande docker compose up suivante pour démarrer votre application.

$ docker compose up --build

Testez maintenant votre connexion à la base de données en ouvrant un navigateur à l'adresse :

http://localhost:3838

Vous devriez voir un message contextuel :

DB CONNECTED

Appuyez sur ctrl+c dans le terminal pour arrêter votre application.

Mettre à jour automatiquement les services

Utilisez Compose Watch pour mettre à jour automatiquement vos services Compose en cours d'exécution lorsque vous modifiez et enregistrez votre code. Pour plus de détails sur Compose Watch, consultez Utiliser Compose Watch.

Les lignes 15 à 18 du fichier compose.yaml contiennent des propriétés qui déclenchent Docker pour reconstruire l'image lorsqu'un fichier dans le répertoire de travail actuel est modifié :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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

Exécutez la commande suivante pour exécuter votre application avec Compose Watch.

$ docker compose watch

Maintenant, si vous modifiez votre app.R, vous verrez les changements en temps réel sans reconstruire l'image !

Appuyez sur ctrl+c dans le terminal pour arrêter votre application.

Résumé

Dans cette section, vous avez vu comment configurer votre fichier Compose pour ajouter une base de données locale et persister les données. Vous avez également appris à utiliser Compose Watch pour reconstruire et exécuter automatiquement votre conteneur lorsque vous mettez à jour votre code.

Informations connexes :

Prochaines étapes

Dans la section suivante, vous verrez comment configurer un pipeline CI/CD en utilisant GitHub Actions.