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

Utiliser des conteneurs pour le développement Node.js

Prérequis

Terminez Conteneuriser une application Node.js.

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 votre conteneur pour exécuter un environnement de développement
  • Le débogage de votre application conteneurisée

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.

  1. Ouvrez votre fichier compose.yaml dans un IDE ou un éditeur de texte.

  2. Décommentez les instructions relatives à la base de données. Voici le fichier compose.yaml mis à jour.

    Important

    Pour cette section, n'exécutez pas docker compose up avant d'y être invité. L'exécution de la commande à des points intermédiaires peut initialiser incorrectement votre base de données.

    compose.yaml
    # Des commentaires sont fournis tout au long de ce fichier pour vous aider à démarrer.
    # Si vous avez besoin de plus d'aide, consultez le guide de référence de Docker Compose à l'adresse
    # https://docs.docker.com/go/compose-spec-reference/
    
    # Ici, les instructions définissent votre application comme un service appelé "server".
    # Ce service est construit à partir du Dockerfile dans le répertoire courant.
    # Vous pouvez ajouter ici d'autres services dont votre application peut dépendre, comme une
    # base de données ou un cache. Pour des exemples, consultez le dépôt Awesome Compose :
    # https://github.com/docker/awesome-compose
    services:
      server:
        build:
          context: .
        environment:
          NODE_ENV: development
          POSTGRES_HOST: db
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD_FILE: /run/secrets/db-password
          POSTGRES_DB: example
        ports:
          - 3000:3000
    
        # La section commentée ci-dessous est un exemple de la façon de définir une base de données
        # PostgreSQL que votre application peut utiliser. `depends_on` indique à Docker Compose de
        # démarrer la base de données avant votre application. Le volume `db-data` persiste les
        # données de la base de données entre les redémarrages des conteneurs. Le secret `db-password` est utilisé
        # pour définir le mot de passe de la base de données. Vous devez créer `db/password.txt` et y ajouter
        # un mot de passe de votre choix avant d'exécuter `docker compose up`.
    
        depends_on:
          db:
            condition: service_healthy
      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.

  3. Ouvrez src/persistence/postgres.js dans un IDE ou un éditeur de texte. Vous remarquerez que cette application utilise une base de données Postgres et nécessite quelques variables d'environnement pour se connecter à la base de données. Le fichier compose.yaml n'a pas encore défini ces variables.

  4. Ajoutez les variables d'environnement qui spécifient la configuration de la base de données. Voici le fichier compose.yaml mis à jour.

    compose.yaml
    # Des commentaires sont fournis tout au long de ce fichier pour vous aider à démarrer.
    # Si vous avez besoin de plus d'aide, consultez le guide de référence de Docker Compose à l'adresse
    # https://docs.docker.com/go/compose-spec-reference/
    
    # Ici, les instructions définissent votre application comme un service appelé "server".
    # Ce service est construit à partir du Dockerfile dans le répertoire courant.
    # Vous pouvez ajouter ici d'autres services dont votre application peut dépendre, comme une
    # base de données ou un cache. Pour des exemples, consultez le dépôt Awesome Compose :
    # https://github.com/docker/awesome-compose
    services:
      server:
        build:
          context: .
        environment:
          NODE_ENV: development
          POSTGRES_HOST: db
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD_FILE: /run/secrets/db-password
          POSTGRES_DB: example
        ports:
          - 3000:3000
    
        # La section commentée ci-dessous est un exemple de la façon de définir une base de données
        # PostgreSQL que votre application peut utiliser. `depends_on` indique à Docker Compose de
        # démarrer la base de données avant votre application. Le volume `db-data` persiste les
        # données de la base de données entre les redémarrages des conteneurs. Le secret `db-password` est utilisé
        # pour définir le mot de passe de la base de données. Vous devez créer `db/password.txt` et y ajouter
        # un mot de passe de votre choix avant d'exécuter `docker compose up`.
    
        depends_on:
          db:
            condition: service_healthy
      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
  5. Ajoutez la section secrets sous le service server pour que votre application gère de manière sécurisée le mot de passe de la base de données. Voici le fichier compose.yaml mis à jour.

    compose.yaml
    # Des commentaires sont fournis tout au long de ce fichier pour vous aider à démarrer.
    # Si vous avez besoin de plus d'aide, consultez le guide de référence de Docker Compose à l'adresse
    # https://docs.docker.com/go/compose-spec-reference/
    
    # Ici, les instructions définissent votre application comme un service appelé "server".
    # Ce service est construit à partir du Dockerfile dans le répertoire courant.
    # Vous pouvez ajouter ici d'autres services dont votre application peut dépendre, comme une
    # base de données ou un cache. Pour des exemples, consultez le dépôt Awesome Compose :
    # https://github.com/docker/awesome-compose
    services:
      server:
        build:
          context: .
        environment:
          NODE_ENV: development
          POSTGRES_HOST: db
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD_FILE: /run/secrets/db-password
          POSTGRES_DB: example
        ports:
          - 3000:3000
    
        # La section commentée ci-dessous est un exemple de la façon de définir une base de données
        # PostgreSQL que votre application peut utiliser. `depends_on` indique à Docker Compose de
        # démarrer la base de données avant votre application. Le volume `db-data` persiste les
        # données de la base de données entre les redémarrages des conteneurs. Le secret `db-password` est utilisé
        # pour définir le mot de passe de la base de données. Vous devez créer `db/password.txt` et y ajouter
        # un mot de passe de votre choix avant d'exécuter `docker compose up`.
    
        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
  6. Dans le répertoire docker-nodejs-sample, créez un répertoire nommé db.

  7. Dans le répertoire db, créez un fichier nommé password.txt. Ce fichier contiendra votre mot de passe de base de données.

    Vous devriez maintenant avoir au moins le contenu suivant dans votre répertoire docker-nodejs-sample.

    ├── docker-nodejs-sample/
    │ ├── db/
    │ │ └── password.txt
    │ ├── spec/
    │ ├── src/
    │ ├── .dockerignore
    │ ├── .gitignore
    │ ├── compose.yaml
    │ ├── Dockerfile
    │ ├── package-lock.json
    │ ├── package.json
    │ └── README.md
  8. Ouvrez le fichier password.txt dans un IDE ou un éditeur de texte, et spécifiez un mot de passe de votre choix. Votre mot de passe doit être sur une seule ligne sans lignes supplémentaires. Assurez-vous que le fichier ne contient aucun caractère de nouvelle ligne ou autre caractère caché.

  9. Assurez-vous d'enregistrer vos modifications dans tous les fichiers que vous avez modifiés.

  10. Exécutez la commande suivante pour démarrer votre application.

    $ docker compose up --build

    Ouvrez un navigateur et accédez à http://localhost:3000. Vous devriez voir une simple application de liste de tâches.

  11. Appuyez sur Ctrl+C dans le terminal pour arrêter votre application.

Configurer le conteneur pour le développement

Lorsque vous développez, vous voulez que les modifications de votre code source soient immédiatement reflétées. De plus, vous voulez également attacher un débogueur à votre application pour déboguer. Vous pouvez y parvenir en utilisant des montages bind et en configurant votre conteneur pour le développement.

  1. Ouvrez votre fichier compose.yaml dans un IDE ou un éditeur de texte.

  2. Dans la section server de votre compose.yaml, mettez à jour la valeur de NODE_ENV à development.

    compose.yaml
    # Des commentaires sont fournis tout au long de ce fichier pour vous aider à démarrer.
    # Si vous avez besoin de plus d'aide, consultez le guide de référence de Docker Compose à l'adresse
    # https://docs.docker.com/go/compose-spec-reference/
    
    # Ici, les instructions définissent votre application comme un service appelé "server".
    # Ce service est construit à partir du Dockerfile dans le répertoire courant.
    # Vous pouvez ajouter ici d'autres services dont votre application peut dépendre, comme une
    # base de données ou un cache. Pour des exemples, consultez le dépôt Awesome Compose :
    # https://github.com/docker/awesome-compose
    services:
      server:
        build:
          context: .
        environment:
          NODE_ENV: development
          POSTGRES_HOST: db
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD_FILE: /run/secrets/db-password
          POSTGRES_DB: example
        ports:
          - 3000:3000
    # ...
  3. Configurez un montage bind pour le server afin que les modifications du code source puissent être reflétées dans le conteneur.

    compose.yaml
    # ...
    services:
      server:
        build:
          context: .
        environment:
          NODE_ENV: development
          POSTGRES_HOST: db
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD_FILE: /run/secrets/db-password
          POSTGRES_DB: example
        ports:
          - 3000:3000
        volumes:
          - ./src:/usr/src/app/src
    # ...

    Le montage bind monte votre répertoire src local dans le répertoire /usr/src/app/src du conteneur.

  4. Configurez l'application pour qu'elle s'exécute en mode débogage avec un processus de rechargement automatique.

    Mettez à jour la commande docker run dans le Dockerfile pour utiliser nodemon. nodemon est un outil qui vous aide à développer des applications basées sur Node.js en redémarrant automatiquement l'application lorsque des modifications de fichiers dans le répertoire sont détectées.

    Dockerfile
    # syntax=docker/dockerfile:1
    FROM node:18-alpine
    WORKDIR /usr/src/app
    COPY package*.json ./
    RUN npm install
    COPY . .
    EXPOSE 3000
    # La section commentée ci-dessous est la commande `docker run` que le
    # conteneur exécutera. Nous utiliserons cette commande pour la production.
    # CMD [ "node", "src/index.js" ]
    
    # La ligne ci-dessous est la commande `docker run` que le conteneur exécutera.
    # Nous utiliserons cette commande pour le développement.
    CMD [ "npm", "run", "dev" ]

    Le package.json a déjà un script de développement qui exécute l'application en mode débogage en utilisant nodemon.

  5. Exposez le port de débogage.

    Mettez à jour votre fichier compose.yaml pour exposer le port de débogage 9229.

    compose.yaml
    # ...
    services:
      server:
        build:
          context: .
        environment:
          NODE_ENV: development
          POSTGRES_HOST: db
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD_FILE: /run/secrets/db-password
          POSTGRES_DB: example
        volumes:
          - ./src:/usr/src/app/src
        ports:
          - 3000:3000
          - 9229:9229
    # ...
  6. Reconstruisez et exécutez l'application.

    $ docker compose up --build

Déboguer l'application conteneurisée

Maintenant que votre conteneur est configuré pour le développement, vous pouvez y attacher un débogueur. Cette section vous montre comment attacher un débogueur à l'aide de Visual Studio Code (VS Code).

  1. Ouvrez docker-nodejs-sample dans VS Code.

  2. Assurez-vous que l'extension Docker pour VS Code est installée et activée.

  3. Dans VS Code, accédez à Exécuter > Ajouter une configuration....

  4. Dans l'invite, sélectionnez Docker : Attacher à Node.

    VS Code crée un fichier .vscode/launch.json pour vous.

    .vscode/launch.json
    {
        "version": "0.2.0",
        "configurations": [
            {
                "type": "node",
                "request": "attach",
                "name": "Docker: Attach to Node",
                "remoteRoot": "/usr/src/app"
            }
        ]
    }
  5. Assurez-vous que votre application s'exécute toujours. Si ce n'est pas le cas, exécutez docker compose up --build dans le terminal.

  6. Définissez un point d'arrêt dans src/server.js à la ligne 50.

  7. Dans VS Code, accédez à Exécuter et déboguer.

  8. Dans le menu déroulant Exécuter et déboguer, sélectionnez Docker : Attacher à Node et appuyez ensuite sur le bouton de lecture.

  9. Ouvrez un navigateur et accédez à http://localhost:3000/.

    Vous devriez voir que l'exécution dans VS Code s'est arrêtée au point d'arrêt que vous avez défini.

  10. Accédez au terminal où votre application s'exécute et appuyez sur Ctrl+C pour l'arrêter.

Résumé

Dans cette section, vous avez appris à mettre en place un environnement de développement pour votre application conteneurisée. Vous avez appris à ajouter une base de données locale, à persister les données, à configurer votre conteneur pour le développement et à déboguer votre application.

Lectures complémentaires recommandées :

Prochaines étapes

Dans la section suivante, vous apprendrez à configurer un flux de travail CI/CD pour votre application.