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.