Docker Compose中环境变量在.env文件中无法正确解析问题的解决方案

42次阅读
没有评论

问题描述

在使用Docker Compose时,遇到了一个关于环境变量解析的问题。他在一个环境文件.env中定义了Gunicorn的启动配置,但是这些环境变量在管道中似乎无法正确解析,导致在运行docker logs gunicorn时出现错误。用户想知道在哪个部分的设置中出现了问题,导致环境变量被破坏。值得注意的是,在终端中手动运行这些环境变量是可以被正确接受的。以下是用户的docker-compose文件:

version: "3"
services:
  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:

解决方案

请注意以下操作可能涉及到版本差异,修改前请做好备份。
用户提到了关于环境变量解析的问题,以及如何在Docker Compose中正确设置这些变量。以下是两个解决方案,分别解释了如何解决这个问题。

方案1:直接传递参数

在Docker Compose文件中,直接传递Gunicorn的命令行参数,而不使用环境变量。这种方式可以确保参数被正确解析。以下是修改后的Docker Compose文件:

version: "3"
services:
  web:
    build: ./web
    container_name: gunicorn
    ports:
      - "8001:8001"
    environment:
      - APP_CONFIG_FILE=../config/development.py
    networks:
      - backend
    command: gunicorn thymedata:app --bind=127.0.0.1:8001 --workers=3
    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:

在上面的解决方案中,我们修改了web服务的command属性,直接传递Gunicorn的命令行参数,包括--bind--workers。这样可以确保参数被正确解析,而不受环境变量的影响。

方案2:使用.env文件中的变量

如果用户仍然想在.env文件中定义这些变量并在Docker Compose中使用,可以按照以下步骤操作:
1. 在.env文件中定义需要的变量,如GUNICORN_BIND_ADDRESSGUNICORN_WORKERS
2. 在Docker Compose文件中使用${}语法引用这些变量。
以下是修改后的.env文件:

GUNICORN_BIND_ADDRESS=127.0.0.1:8001
GUNICORN_WORKERS=3

以下是修改后的Docker Compose文件:

version: "3"
services:
  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 --bind=${GUNICORN_BIND_ADDRESS} --workers=${GUNICORN_WORKERS}
    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:

在上面的解决方案中,我们使用${}语法引用.env文件中定义的变量,确保这些变量的值被正确传递给Gunicorn命令行。请注意,这种方式仅适用于已经在终端中设置了这些变

正文完