Почему переменная среды искажена в Docker, создайте файл среды


10

Контекст: docker-compose для запуска нескольких контейнеров, включая Gunicorn, который вызывает приложение Flask. Я использую файл окружения web/env.gunicornдля хранения моей конфигурации запуска Gunicorn. Этот файл содержит

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

Проблема в том, что GUNICORN_CMD_ARGSне обрабатывается правильно где-то в конвейере. Ошибка , что я получаю при запуске docker logs gunicornIS

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

Вопрос в том, где в моих настройках мои предположения неверны, что приводит к искажению переменной среды? Переменная среды принимается при запуске вручную в терминале. Составной файл Docker выглядит следующим образом

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:

Не используя gunicorn, но читая документацию, в примечании нет знака = переменная env. Я бы попробовал с пробелом, но звучит так, как будто он не анализирует должным образом множители аргументов и, как таковой, может быть ошибкой в ​​gunicorn (инвертирование порядка аргументов для завершения с помощью аргумента bind может быть обходным путем или может вызвать проблему разделения рабочий параметр)
Тенсибай

Я пытался изменить порядок параметров, но это не помогло. Я также попытался запустить Gunicorn из командной строки с помощью GUNICORN_CMD_ARGSset, и он принял его правильно (количество рабочих и адрес проверены). Вот почему я полагаю, что проблема на стороне Докера.
Мориц

ERROR: build path /home/ben/devopsStackExchange/web either does not exist, is not accessible, or is not a valid URL., Пожалуйста, создайте steps to reproduce paragraphи добавьте необходимые файлы, чтобы другие люди могли помочь вам, по крайней мере, позволить им воспроизвести проблему.
030

Пожалуйста, добавьте хотя бы Dockerfile Gunicorn.
030

Я не использую Dockerfile Gunicorn. Я буду придерживаться command: gunicorn thymedata:app --bind=127.0.0.1:8001 --workers=3версии, так как переменные, загруженные через env_file, не принимаются. Они уже должны быть установлены в вызывающем терминале.
Мориц

Ответы:


2

После прочтения главы, посвященной командам, и поиска этого примера , похоже, что пользовательский GUNICORN_CMD_ARGSинтерфейс можно опустить, просто передав аргументы напрямую:

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

Если кто-то действительно хочет использовать переменные, это можно сделать следующим образом:

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} будет оценивать только переменные, уже находящиеся в терминале, но не загруженные через них env_file. Поскольку я не
Мориц

3

У меня была похожая проблема, и это сработало для меня без чувства хака ...

docker-compose.yml :

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

Примечание: добавьте env GUNICORN_CMD_ARGS без кавычек

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

Примечание. Запустите приложение CMD gunicorn: приложение без передачи параметров через массив или кавычки.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.