Pourquoi la variable d'environnement est-elle modifiée dans le fichier d'environnement Docker compose

10

Contexte: docker-compose pour démarrer plusieurs conteneurs, y compris Gunicorn qui appelle une application Flask. J'utilise un fichier d'environnement web/env.gunicornpour stocker ma configuration de démarrage Gunicorn. Ce fichier contient

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

Le problème est qu'il GUNICORN_CMD_ARGSn'est pas traité correctement quelque part dans le pipeline. L'erreur que j'obtiens lors de l'exécution docker logs gunicornest

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

La question est, où dans ma configuration mes hypothèses sont-elles erronées, provoquant ainsi la modification de la variable d'environnement? La variable d'environnement est acceptée lorsqu'elle est exécutée manuellement dans un terminal. Le fichier de composition du docker se présente comme suit

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
la source
Ne pas utiliser gunicorn, mais en lisant le document, il n'y a pas de signe = se déconnecter de la note à propos de la variable env. J'essaierais avec un espace, mais il semble qu'il n'analyse pas correctement les arguments multiples et en tant que tel, c'est peut-être un bug dans gunicorn (inverser l'ordre des arguments pour terminer par l'argument bind peut être une solution de contournement ou présenter le problème de division avec le paramètre travailleurs)
Tensibai
J'ai essayé de changer l'ordre des paramètres, mais cela n'a pas aidé. J'ai également essayé de démarrer Gunicorn à partir de la ligne de commande avec GUNICORN_CMD_ARGSset, et il l'a accepté correctement (nombre de travailleurs et adresse vérifiés). C'est pourquoi je suppose que le problème est du côté de Docker.
Moritz
ERROR: build path /home/ben/devopsStackExchange/web either does not exist, is not accessible, or is not a valid URL.. Veuillez créer un steps to reproduce paragraphfichier et ajouter les fichiers requis afin que d'autres personnes puissent vous aider en leur permettant au moins de reproduire le problème.
030
Veuillez ajouter au moins le Dockerfile Gunicorn.
030
Je n'utilise pas de Dockerfile Gunicorn. Je m'en tiendrai à la command: gunicorn thymedata:app --bind=127.0.0.1:8001 --workers=3version, car les variables chargées via env_filene sont pas acceptées. Ils doivent déjà être définis dans le terminal appelant.
Moritz

Réponses:

2

Après avoir lu le chapitre des commandes et trouvé cet exemple , il semble que la coutume GUNICORN_CMD_ARGSpourrait être omise en passant simplement les arguments directement:

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

Si l'on souhaite vraiment utiliser des variables, cela peut être fait comme suit:

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

.env

GUNICORN_BIND_ADDRESS=127.0.0.1:8001
GUNICORN_WORKERS=3
030
la source
$ {GUNICORN_BIND_ADDRESS} n'évaluera que les variables déjà présentes dans le terminal, aucune qui n'est chargée via env_file. Puisque je ne pose aucun secret, c'est une solution acceptable
Moritz
3

J'ai eu un problème similaire et cela a fonctionné pour moi sans qu'il ressemble à un hack ...

docker-compose.yml :

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

Remarque: ajoutez env GUNICORN_CMD_ARGS sans guillemets

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

Remarque: exécutez l'application CMD gunicorn: application sans passer d'options via un tableau ou des guillemets

Andres
la source