¿Por qué la variable de entorno está destrozada en el archivo de entorno de composición Docker

10

Contexto: docker-compose para iniciar varios contenedores, incluido Gunicorn que llama a una aplicación Flask. Estoy usando un archivo de entorno web/env.gunicornpara almacenar mi configuración de inicio de Gunicorn. Este archivo contiene

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

El problema es que GUNICORN_CMD_ARGSno se procesa correctamente en algún lugar de la tubería. El error que obtengo al ejecutar docker logs gunicornes

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

La pregunta es, ¿en qué parte de mi configuración están equivocados mis supuestos, lo que hace que la variable de entorno se destruya? La variable de entorno se acepta cuando se ejecuta manualmente en un terminal. El archivo de composición del acoplador se ve de la siguiente manera

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
fuente
No usando gunicorn, pero leyendo el documento no hay = salir de la nota sobre la variable env. Intentaría con un espacio, pero parece que no analiza correctamente los argumentos múltiples y, como tal, tal vez sea un error en gunicorn (invertir el orden de los argumentos para terminar con el argumento de enlace puede ser una solución o exhibir el problema de división con el parámetro de los trabajadores)
Tensibai
Intenté cambiar el orden de los parámetros, pero eso no ayudó. También intenté iniciar Gunicorn desde la línea de comando con GUNICORN_CMD_ARGSset, y lo aceptó correctamente (# de trabajadores y dirección marcada). Por eso supongo que el problema está del lado de Docker.
Moritz
ERROR: build path /home/ben/devopsStackExchange/web either does not exist, is not accessible, or is not a valid URL.. Cree steps to reproduce paragraphy agregue los archivos necesarios para que otras personas puedan ayudarlo al menos permitiéndoles reproducir el problema.
030
Agregue al menos el archivo Docker de Gunicorn.
030
No uso un archivo Docker de Gunicorn. Me atendré a la command: gunicorn thymedata:app --bind=127.0.0.1:8001 --workers=3versión, ya que env_fileno se aceptan las variables cargadas a través de . Ya deben estar configurados en el terminal de llamada.
Moritz

Respuestas:

2

Después de leer el capítulo de comandos y encontrar este ejemplo , parece que la costumbre GUNICORN_CMD_ARGSpodría omitirse simplemente pasando los argumentos directamente:

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

Si realmente quisiera usar variables, entonces podría hacerse de la siguiente manera:

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

.env

GUNICORN_BIND_ADDRESS=127.0.0.1:8001
GUNICORN_WORKERS=3
030
fuente
$ {GUNICORN_BIND_ADDRESS} solo evaluará las variables que ya están en la terminal, ninguna que se cargue a través de env_file. Como no guardo ningún secreto, es una solución aceptable
Moritz
3

Tuve un problema similar y esto funcionó para mí sin que pareciera un truco ...

docker-compose.yml :

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

Nota: agregue env GUNICORN_CMD_ARGS sin comillas

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

Nota: ejecute la aplicación CMD gunicorn: aplicación sin pasar opciones a través de una matriz o comillas

Andres
fuente