Почему переменная среды искажена в 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.