Dlaczego zmienna środowiskowa jest zniekształcona w pliku środowiska dokowanego


10

Kontekst: skompiluj okno dokowane, aby uruchomić kilka kontenerów, w tym Gunicorn, który wywołuje aplikację Flask. Używam pliku środowiska web/env.gunicorndo przechowywania mojej konfiguracji uruchamiania Gunicorn. Ten plik zawiera

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

Problem polega na tym, że GUNICORN_CMD_ARGSgdzieś w potoku nie jest poprawnie przetwarzany. Błąd, który mam kiedy działa docker logs gunicornIS

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

Pytanie brzmi: gdzie w mojej konfiguracji moje założenia są błędne, powodując tym samym zniekształcenie zmiennej środowiskowej? Zmienna środowiskowa jest akceptowana, gdy jest uruchamiana ręcznie w terminalu. Plik tworzenia okna dokowanego wygląda następująco

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:

Nie używając gunicorn, ale czytając dokument, nie ma = wyloguj się z notatki o zmiennej env. Spróbowałbym ze spacją, ale wygląda na to, że nie analizuje poprawnie mnożenia argumentów i jako taki może być błąd w gunicorn (odwrócenie kolejności argumentów kończących się argumentem wiązania może być obejściem lub może powodować problem z rozdzieleniem parametr pracowników)
Tensibai

Próbowałem zmienić kolejność parametrów, ale to nie pomogło. Próbowałem także uruchomić Gunicorn z wiersza poleceń z GUNICORN_CMD_ARGSustawionym zestawem i zaakceptowałem go poprawnie (liczba pracowników i adres sprawdzone). Dlatego przypuszczam, że problem leży po stronie Dockera.
Moritz

ERROR: build path /home/ben/devopsStackExchange/web either does not exist, is not accessible, or is not a valid URL.. Utwórz steps to reproduce paragraphi dodaj wymagane pliki, aby inne osoby mogły Ci pomóc, przynajmniej umożliwiając im odtworzenie problemu.
030

Dodaj przynajmniej plik doków Gunicorn.
030

Nie używam pliku dokowanego Gunicorn. Pozostanę przy command: gunicorn thymedata:app --bind=127.0.0.1:8001 --workers=3wersji, ponieważ zmienne ładowane przez env_filenie są akceptowane. Muszą być już ustawione w terminalu wywołującym.
Moritz

Odpowiedzi:


2

Po przeczytaniu rozdziału poleceń i znalezieniu tego przykładu wygląda na to, że zwyczaj GUNICORN_CMD_ARGSmożna pominąć, przekazując bezpośrednio argumenty:

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

Jeśli naprawdę chciałoby się używać zmiennych, można to zrobić w następujący sposób:

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

.env

GUNICORN_BIND_ADDRESS=127.0.0.1:8001
GUNICORN_WORKERS=3

$ {GUNICORN_BIND_ADDRESS} oceni tylko zmienne już w terminalu, żadne nie są ładowane przez env_file. Ponieważ nie ustalam żadnych tajemnic, jest to akceptowalne rozwiązanie
Moritz

3

Miałem podobny problem i to działało dla mnie bez poczucia się jak hack ...

docker-compose.yml :

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

Uwaga: dodaj env GUNICORN_CMD_ARGS bez cudzysłowów

Plik Docker :

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

Uwaga: uruchom aplikację CMD gunicorn: aplikację bez przekazywania opcji przez tablicę lub cytaty

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.