Ich habe diese Docker-Compose-Konfiguration, in die ich einen Chrome Headless-Browser einbetten möchte, um meine e2e-Tests auszuführen ...

Das nginx ist so konfiguriert, dass es den Proxy einer URL umkehrt, sagen wir foo.bar irgendwo hin ... Dies funktioniert einwandfrei, wenn ich meinen Host-Browser verwende, und ich kann es testen, indem ich die 444:443 - Ports offenlege!

Es funktioniert jedoch nicht, wenn ich versuche, das chrome-alpine zu verwenden. Ich navigiere zum Debugger localhost:9222, wähle die Instanz aus und gebe dann Folgendes ein: http://foo.bar.

Wie kann ich alpine-chrome für die Verwendung des Nginx-Containers konfigurieren?

services:
  nginx:
    image: nginx:alpine
    command: [nginx-debug, "-g", "daemon off;"]
    volumes:
      - ../../config/nginx/nginx.config.d:/etc/nginx/conf.d/server.conf
      - ../../config/nginx/certs:/etc/nginx/certs
    ports:
      - "444:443"

  chrome:
    image: zenika/alpine-chrome:latest
    command: [chromium-browser, "--headless", "--disable-gpu", "--no-sandbox", "--remote-debugging-address=0.0.0.0", "--remote-debugging-port=9222"]
    ports:
      - "9222:9222"

Erwartet

  1. Navigieren Sie zu localhost:9222
  2. Öffnen Sie den Chrome-Remote-Debugger
  3. Geben Sie die URL foo.bar ein
  4. Nginx Reverse Proxy foo.bar zu (z. B.) google.com haben
1
Hitmands 26 Juni 2019 im 09:28

3 Antworten

Beste Antwort

Ich konnte es zum Laufen bringen, indem ich eine statische IP für den Nginx-Container wie folgt definierte:

Hinweis: Der Zweck des Festlegens einer statischen IP für nginx besteht darin, Probleme zu vermeiden, die aufgrund von IP-Änderungen auftreten können.

version: "2"
services:
  nginx:
    image: nginx:alpine
    command: [nginx-debug, "-g", "daemon off;"]
    ports:
      - 80:80
    networks:
      nginx-chrome-network:
        ipv4_address: 172.28.1.1

  chrome:
    image: zenika/alpine-chrome:latest
    command: [chromium-browser, "--headless", "--disable-gpu", "--no-sandbox", "--remote-debugging-address=0.0.0.0", "--remote-debugging-port=9222"]
    ports:
      - "9222:9222"
    networks:
      - nginx-chrome-network
    extra_hosts:
      foo.bar: 172.28.1.1


networks:
  nginx-chrome-network:
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16

Wenn Sie dann zu localhost:9222 gehen und einen neuen Tab öffnen und dann foo.bar eingeben, erhalten Sie den gleichen Screenshot:

enter image description here

2
Mostafa Hussein 26 Juni 2019 im 08:15

Es ist schade, dass ich nach dem Test keine einfache Lösung gefunden habe. Ich denke, die statische IP-Lösung von @Mostafa Hussein ist die einfachste, um die Anforderung zu realisieren.

Das Ergebnis meiner Untersuchung ist der Alias foo.bar als 127.0.0.1 und socat, um 127.0.0.1 Netzwerkverkehr an mynginx weiterzuleiten, hier socat könnte mynginx verwenden, das in extra_hosts: nicht verwendet werden könnte

Also, meine Lösung ist die nächste, hässlich, aber falls jemand sie später braucht:

version: '3'

services:
  nginx:
    image: nginx:alpine
    container_name: mynginx
    command: [nginx-debug, "-g", "daemon off;"]
    ports:
      - "444:443"

  chrome:
    image: zenika/alpine-chrome:latest
    container_name: mychrome
    command: [chromium-browser, "--headless", "--disable-gpu", "--no-sandbox", "--remote-debugging-address=0.0.0.0", "--remote-debugging-port=9222"]
    ports:
      - "9222:9222"
    extra_hosts:
      - "foo.bar:127.0.0.1"

  helper:
    image: ubuntu:16.04
    volumes:
      - /usr/bin/docker:/usr/bin/docker
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7
    tty: true
    command: bash -c "docker exec -u root -it mychrome /bin/sh -c \"apk add socat && socat TCP4-LISTEN:80,reuseaddr,fork TCP4:mynginx:80\""
    depends_on:
      - chrome

Und der Test:

shubuntu1@shubuntu1:~/99$ docker exec -it mychrome wget -q -O - http://foo.bar
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
2
atline 27 Juni 2019 im 01:32

Sie müssen links unter Ihrem chrome Container verwenden und nginx von nginx: port aufrufen:

links:
   - nginx

Oder Sie können den Netzwerktreiber host für beide Container verwenden und sich gegenseitig über localhost: port aufrufen

network: host

Die Netzwerkkonfiguration sollte sich unter jedem Dienst befinden. Siehe auch this

1
LinPy 26 Juni 2019 im 07:16