Warum wird die Umgebungsvariable in der Docker-Umgebungsdatei komponiert?

10

Kontext: Docker-Compose zum Starten mehrerer Container, einschließlich Gunicorn, das eine Flask-App aufruft. Ich verwende eine Umgebungsdatei web/env.gunicornzum Speichern meiner Gunicorn-Startkonfiguration. Diese Datei enthält

GUNICORN_CMD_ARGS="--bind=127.0.0.1:8001 --workers=3"

Das Problem ist, dass GUNICORN_CMD_ARGSirgendwo in der Pipeline nicht richtig verarbeitet wird. Der Fehler, den ich beim Laufen bekomme, docker logs gunicornist

Error: '8001 --workers=3' is not a valid port number.

Die Frage ist, wo in meinem Setup meine Annahmen falsch sind, wodurch die Umgebungsvariable entstellt wird. Die Umgebungsvariable wird akzeptiert, wenn sie manuell in einem Terminal ausgeführt wird. Die Docker-Erstellungsdatei sieht wie folgt aus

version: "3"
services:
#  nginx:
#    image: nginx:latest
#    ports:
#      - "80:80"
#    volumes:
#      - ./nginx:/etc/nginx/conf.d
#    depends_on:
#      - web

  web:
    build: ./web
    container_name: gunicorn
    ports:
      - "8001:8001"
    environment:
      - APP_CONFIG_FILE=../config/development.py
    env_file:
      - 'web/env.gunicorn'
    networks:
      - backend
    command: gunicorn thymedata:app
    depends_on:
      - influxdb
      - grafana

  influxdb:
    image: influxdb:latest
    container_name: influxdb
    ports:
      - "8086:8086"
    env_file:
      - 'influxdb/env.influxdb'
      - 'influxdb/secrets.influxdb'
    networks:
      - backend
    volumes:
      - influxdb-data:/var/lib/influxdb

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    env_file:
      - 'grafana/env.grafana'
      - 'grafana/secrets.grafana'
    networks:
      - backend
    volumes:
      - grafana-data:/var/lib/grafana
    depends_on:
      - influxdb

networks:
  backend:

volumes:
  influxdb-data:
  grafana-data:
Moritz
quelle
Kein Gunicorn verwenden, aber beim Lesen des Dokuments gibt es kein = Abmelden von der Notiz über die env-Variable. Ich würde es mit einem Leerzeichen versuchen, aber es klingt so, als würde es mehrere Argumente nicht richtig analysieren und als solches ist es möglicherweise ein Fehler im Gunicorn (das Umkehren der Argumentreihenfolge, um mit dem Bindungsargument zu enden, kann eine Problemumgehung sein oder das Split-Problem mit aufweisen der Arbeiterparameter)
Tensibai
Ich habe versucht, die Reihenfolge der Parameter zu ändern, aber das hat nicht geholfen. Ich habe auch versucht, Gunicorn über set über die Befehlszeile zu starten GUNICORN_CMD_ARGS, und es wurde ordnungsgemäß akzeptiert ( Anzahl der Arbeiter und Adresse überprüft). Deshalb nehme ich an, dass das Problem auf Dockers Seite liegt.
Moritz
ERROR: build path /home/ben/devopsStackExchange/web either does not exist, is not accessible, or is not a valid URL.. Bitte erstellen Sie eine steps to reproduce paragraphund fügen Sie die erforderlichen Dateien hinzu, damit andere Personen Ihnen helfen können, indem sie ihnen zumindest erlauben, das Problem zu reproduzieren.
030
Bitte fügen Sie mindestens das Gunicorn Dockerfile hinzu.
030
Ich benutze kein Gunicorn Dockerfile. Ich bleibe bei der command: gunicorn thymedata:app --bind=127.0.0.1:8001 --workers=3Version, da die über geladenen Variablen env_filenicht akzeptiert werden. Sie müssen bereits im anrufenden Terminal eingestellt sein.
Moritz

Antworten:

2

Nach dem Lesen des Befehlskapitels und dem Auffinden dieses Beispiels sieht es so aus, als GUNICORN_CMD_ARGSkönnte der Brauch weggelassen werden, indem nur die Argumente direkt übergeben werden:

command: gunicorn thymedata:app --bind=127.0.0.1:8001 --workers=3

Wenn man wirklich Variablen verwenden möchte, kann dies wie folgt erfolgen:

command: gunicorn thymedata:app --bind=${GUNICORN_BIND_ADDRESS} --workers=${GUNICORN_WORKERS}

.env

GUNICORN_BIND_ADDRESS=127.0.0.1:8001
GUNICORN_WORKERS=3
030
quelle
$ {GUNICORN_BIND_ADDRESS} wertet nur Variablen aus, die sich bereits im Terminal befinden, keine, die über geladen werden env_file. Da ich keine Geheimnisse setze, ist es eine akzeptable Lösung
Moritz
3

Ich hatte ein ähnliches Problem und das hat bei mir funktioniert, ohne dass es sich wie ein Hack anfühlte ...

docker-compose.yml :

version: '3'
services:
   web:
      build .
      environment:
      - GUNICORN_CMD_ARGS=--workers=0 --bind=0.0.0.0:8000 --timeout=10

Hinweis: Fügen Sie env GUNICORN_CMD_ARGS ohne Anführungszeichen hinzu

Dockerfile :

FROM python:3.6-slim
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
ENV GUNICORN_CMD_ARGS="--bind=0.0.0.0:8000 --workers=3"
CMD gunicorn app:app

Hinweis: Führen Sie die CMD gunicorn App aus: App, ohne Optionen über Array oder Anführungszeichen zu übergeben

Andres
quelle