为什么在docker compose环境文件中损坏了环境变量


10

上下文:docker-compose启动多个容器,包括调用Flask应用程序的Gunicorn。我正在使用环境文件web/env.gunicorn来存储我的Gunicorn启动配置。该文件包含

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

问题是GUNICORN_CMD_ARGS管道中某处未正确处理。我在运行时遇到的错误docker logs gunicorn

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参数结尾可能是一种解决方法,或者显示带有工人参数)
Tensibai

我尝试更改参数的顺序,但这没有帮助。我还尝试从命令行使用GUNICORN_CMD_ARGSset 启动Gunicorn ,它正确接受了(检查了工人数量和地址)。这就是为什么我认为问题出在Docker方面。
莫里茨

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

请至少添加Gunicorn Dockerfile。
030

我不使用Gunicorn Dockerfile。我会坚持使用该command: gunicorn thymedata:app --bind=127.0.0.1:8001 --workers=3版本,因为env_file不接受通过加载的变量。必须已经在呼叫终端中设置了它们。
莫里兹

Answers:


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。由于我没有设置任何秘密,因此这是可以接受的解决方案
Moritz

3

我有一个类似的问题,这对我有用,而没有感觉像黑客...

docker-compose.yml

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

注意:添加环境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 app:app

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.