Usare il proxy di sviluppo con Docker Compose

A colpo d'occhio
Obiettivo: Usare il proxy di sviluppo con Docker Compose
Tempo: 20 minuti
Plugin: Vari
Prerequisiti: ConfigurareIl Proxy di sviluppo, Docker e Docker Compose installati

Quando si sviluppano applicazioni con Docker, è possibile usare Dev Proxy per testare il modo in cui l'app gestisce gli errori dell'API, la limitazione o le risposte fittizie dell'API. Questo articolo illustra come usare Dev Proxy con Docker Compose in due scenari:

  • Dev Proxy in esecuzione nel computer host, app in un contenitore
  • Dev Proxy in esecuzione in un contenitore insieme al contenitore dell'app

Scenario 1: Dev Proxy nell'host, app nel contenitore

In questo scenario si esegue Dev Proxy direttamente nel computer mentre l'applicazione viene eseguita in un contenitore Docker. Questo approccio è utile quando si sviluppa attivamente e si vuole interagire direttamente con Dev Proxy.

Configurare il contenitore dell'applicazione

Crea un docker-compose.yaml file che configuri l'applicazione per l'uso del proxy di sviluppo in esecuzione nell'host.

services:
  app:
    build: .
    environment:
      # Point to Dev Proxy on the host machine
      - HTTPS_PROXY=http://host.docker.internal:8000
      - HTTP_PROXY=http://host.docker.internal:8000
      # For Node.js applications
      - NODE_TLS_REJECT_UNAUTHORIZED=0
    extra_hosts:
      # Ensure host.docker.internal resolves correctly on Linux
      - "host.docker.internal:host-gateway"

Avviare Dev Proxy nell'host

Prima di avviare il contenitore dell'applicazione, avviare Dev Proxy nel computer host. In macOS e Linux associare Dev Proxy a tutte le interfacce di rete:

devproxy --ip-address 0.0.0.0

In Windows è possibile avviare il proxy di sviluppo normalmente:

devproxy

Gestire i certificati TLS/SSL

Quando l'applicazione effettua richieste HTTPS tramite Dev Proxy, il contenitore deve considerare attendibile il certificato del proxy di sviluppo. È possibile procedere in due modi:

Opzione 1: Disabilitare la convalida del certificato (solo sviluppo)

Per i test rapidi, è possibile disabilitare la convalida dei certificati nell'applicazione. Per le applicazioni Node.js, impostare la NODE_TLS_REJECT_UNAUTHORIZED=0 variabile di ambiente (già inclusa nell'esempio precedente). Per le applicazioni .NET, è possibile configurare il client HTTP per ignorare la convalida del certificato.

Attenzione

Non disabilitare mai la convalida del certificato nel codice di produzione.

Opzione 2: Considerare attendibile il certificato del proxy di sviluppo nel contenitore

Per un'installazione più simile alla produzione, installare il certificato Dev Proxy nel container. Prima di tutto, esportare il certificato dall'host e aggiungerlo all'immagine Docker. Per informazioni dettagliate, vedere Usare Dev Proxy con applicazioni .NET in esecuzione in Docker .

Avviare l'applicazione

Avviare il contenitore dell'applicazione:

docker compose up

L'applicazione ora instrada tutto il traffico HTTP e HTTPS tramite Dev Proxy in esecuzione nell'host.

Scenario 2: Proxy di sviluppo e app in contenitori separati

In questo scenario più avanzato, sia Dev Proxy che l'applicazione vengono eseguiti nei contenitori Docker. Questo approccio è utile per le pipeline CI/CD o quando si vuole un ambiente di sviluppo completamente in contenitori.

Creare il volume del certificato

Entrambi i contenitori devono accedere al certificato del proxy di sviluppo. Creare un volume Docker per condividerlo:

docker volume create devproxy-cert

Creare lo script del punto di ingresso

Crea uno entrypoint.sh script che installa il certificato del proxy di sviluppo quando il contenitore dell'applicazione si avvia.

#!/bin/bash
set -e

# Wait for the Dev Proxy certificate to be available
echo "Waiting for Dev Proxy certificate..."
while [ ! -f /cert/rootCert.pfx ]; do
  sleep 1
done

# Convert PFX to PEM format
openssl pkcs12 \
  -in /cert/rootCert.pfx \
  -out /usr/local/share/ca-certificates/dev-proxy-ca.crt \
  -clcerts \
  -nokeys \
  -passin pass:""

# Update system certificates
update-ca-certificates

echo "Dev Proxy certificate installed"

# Execute the main command
exec "$@"

Rendere eseguibile lo script:

chmod +x entrypoint.sh

Creare il Dockerfile dell'applicazione

Creare un Dockerfile per l'applicazione che includa i prerequisiti di installazione del certificato:

# Example for a Node.js application
FROM node:20

# Install certificate tools
RUN apt-get update && apt-get install -y \
    openssl \
    ca-certificates \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

# Copy application files
COPY package*.json ./
RUN npm install
COPY . .

# Copy entrypoint script
COPY entrypoint.sh /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]
CMD ["node", "index.js"]

Creare la configurazione di Docker Compose

Creare un docker-compose.yaml file che definisce entrambi i servizi:

services:
  dev-proxy:
    image: ghcr.io/dotnet/dev-proxy:latest
    ports:
      - "8000:8000"
      - "8897:8897"
    volumes:
      # Mount your Dev Proxy configuration
      - ./devproxyrc.json:/config/devproxyrc.json
      # Share the certificate with the app container
      - devproxy-cert:/home/devproxy/.config/dev-proxy/rootCert
    # Generate the certificate on startup
    command: ["--install-cert"]
    stdin_open: true
    tty: true

  app:
    build: .
    depends_on:
      - dev-proxy
    environment:
      # Point to the Dev Proxy container
      - HTTPS_PROXY=http://dev-proxy:8000
      - HTTP_PROXY=http://dev-proxy:8000
    volumes:
      # Mount the certificate volume
      - devproxy-cert:/cert:ro

volumes:
  devproxy-cert:

Creare un file di configurazione del proxy di sviluppo

Creare un devproxyrc.json file nella stessa directory di docker-compose.yaml:

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.1.0/rc.schema.json",
  "urlsToWatch": [
    "https://api.example.com/*",
    "https://graph.microsoft.com/*"
  ],
  "plugins": [
    {
      "name": "GenericRandomErrorPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll"
    }
  ]
}

Avvia i contenitori

Avviare entrambi i contenitori con Docker Compose:

docker compose up

Dev Proxy viene avviato per primo e viene generato il relativo certificato. Il contenitore dell'applicazione attende il certificato, lo installa e quindi avvia l'applicazione. Tutte le richieste HTTP e HTTPS dall'applicazione vengono ora instradate tramite Dev Proxy.

Interagire con il proxy di sviluppo

Poiché Dev Proxy viene eseguito in un contenitore, è possibile interagire con esso in diversi modi:

Uso del terminale

Connettersi al contenitore Dev Proxy:

docker attach <container-name>

Uso dell'API del proxy di sviluppo

L'API del proxy di sviluppo è esposta sulla porta 8897. È possibile usarlo per controllare il proxy di sviluppo a livello di codice:

# Start recording
curl -X POST http://localhost:8897/proxy/recording/start

# Stop recording
curl -X POST http://localhost:8897/proxy/recording/stop

Per altre informazioni, vedere Dev Proxy API.

Vedere anche