Por que a variável de ambiente é confinada no arquivo de ambiente de composição do docker


10

Contexto: docker-componha para iniciar vários contêineres, incluindo o Gunicorn que chama um aplicativo Flask. Estou usando um arquivo de ambiente web/env.gunicornpara armazenar minha configuração de inicialização do Gunicorn. Este arquivo contém

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

O problema é que GUNICORN_CMD_ARGSnão é processado corretamente em algum lugar do pipeline. O erro que recebo ao executar docker logs gunicorné

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

A questão é: onde na minha configuração minhas suposições estão erradas, fazendo com que a variável de ambiente seja mutilada? A variável de ambiente é aceita quando executada manualmente em um terminal. O arquivo de composição do docker tem a seguinte aparência

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:

Não usando gunicorn, mas lendo o documento, não há = ​​sair da nota sobre a variável env. Eu tentaria com um espaço, mas parece que ele não analisa corretamente múltiplos argumentos e, como tal, talvez seja um bug no gunicorn (inverter a ordem dos argumentos para terminar pelo argumento de ligação pode ser uma solução alternativa ou exibir o problema de divisão com o parâmetro dos trabalhadores)
Tensibai

Tentei alterar a ordem dos parâmetros, mas isso não ajudou. Também tentei iniciar o Gunicorn a partir da linha de comando com GUNICORN_CMD_ARGSset, e ele o aceitou corretamente (número de trabalhadores e endereço verificado). É por isso que suponho que o problema esteja do lado de Docker.
Moritz

ERROR: build path /home/ben/devopsStackExchange/web either does not exist, is not accessible, or is not a valid URL.. Crie steps to reproduce paragraphe adicione os arquivos necessários para que outras pessoas possam ajudá-lo, pelo menos, permitindo que elas reproduzam o problema.
030

Adicione pelo menos o arquivo Dockerfile Gunicorn.
030

Eu não uso um arquivo Dockerfile Gunicorn. Vou manter a command: gunicorn thymedata:app --bind=127.0.0.1:8001 --workers=3versão, pois as variáveis ​​carregadas via env_filenão são aceitas. Eles já devem estar configurados no terminal de chamada.
Moritz

Respostas:


2

Depois de ler o capítulo de comandos e encontrar esse exemplo , parece que o costume GUNICORN_CMD_ARGSpode ser omitido apenas passando os argumentos diretamente:

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

Se alguém realmente gostaria de usar variáveis, isso poderia ser feito da seguinte maneira:

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} avaliará apenas variáveis ​​já existentes no terminal, nenhuma que seja carregada via env_file. Como não guardo segredos, é uma solução aceitável.
Moritz

3

Eu tive um problema semelhante e isso funcionou para mim sem parecer um hack ...

docker-compose.yml :

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

Nota: adicione env GUNICORN_CMD_ARGS sem aspas

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: execute o CMD gunicorn app: app sem passar opções via array ou aspas

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.