【问题标题】:docker-compose set environment variable doesn't workdocker-compose 设置环境变量不起作用
【发布时间】:2018-12-11 04:40:31
【问题描述】:

我使用docker 并且还使用docker-compose 来绑定每个容器。

在我的 python 烧瓶代码中,像这样引用环境变量。

import os

from app import db, create_app


app = create_app(os.getenv('FLASK_CONFIGURATION') or 'development')

if __name__ == '__main__':
    print(os.getenv('FLASK_CONFIGURATION'))
    app.run(host='0.0.0.0', debug=True)

这里还有 docker-compose.yml。

version: '3.7'

services:
  nginx:
    build: 
      context: .
      dockerfile: docker/nginx/dockerfile
    container_name: nginx
    hostname: nginx-prod
    ports:
      - '80:80'
    networks: 
      - backend
    links:
      - web_project
    depends_on:
      - web_project
    environment:
      - FLASK_CONFIGURATION=production

  mongodb:
    build:
      context: .
      dockerfile: docker/mongodb/dockerfile
    container_name: mongodb
    hostname: mongodb-prod
    ports:
      - '27017:27017'
    networks:
      - backend

  web_project:
    build:
      context: .
      dockerfile: docker/web-prod/dockerfile
    container_name: web_project
    hostname: web_project_prod
    ports:
      - '5000:5000'
    networks:
      - backend
    tty: true
    depends_on:
      - mongodb
    links:
      - mongodb
    environment:
      - FLASK_CONFIGURATION=production

networks: 
  backend:
    driver: 'bridge'

我通过环境命令设置FLASK_CONFIGURATION=production

但是当我执行时,可能FLASK_CONFIGURATION=production 不起作用。

我还尝试ENV FLASK_CONFIGURATION production 到每个 dockerfile。 (也不行)

奇怪的是,当我通过 bash(docker exec -it bash) 进入我的容器并使用 export 检查环境变量时,它设置得很完美。

我的 docker 设置中有错误的代码吗?

谢谢。

【问题讨论】:

  • 那么如果你登录到 nginx 容器并查看 env 变量是否设置会发生什么?
  • FLASK_CONFIGURATION=production 设置完美。但它不起作用。
  • 另一个奇怪的事情是,当我通过 bash shell 执行我的烧瓶服务器时,它可以工作。
  • 是的,我同意语法看起来是正确的。您可以尝试 docker exec-it bash 到容器上并执行 grep env 吗?如果 FLASK_CONFIGURATION 设置为正确的值,你应该没有任何问题
  • 我已经检查过了,它设置得很完美。这就是我陷入困惑的原因:(

标签: docker docker-compose


【解决方案1】:

[已解决]

是主管造成的。

使用supervisor时,它的shell与原版是隔离的。

所以我们必须在 supervisor.conf 中定义我们的环境变量

【讨论】:

    【解决方案2】:

    你的烧瓶代码看起来不错,正如你所说......在bash中这个ENV变量存在,

    我给你的建议是想办法把这个变量放到你项目中的 .env 文件中。

    我会解释为什么我会说我在 cron 遇到的类似问题:

    cron 在他的“自己的世界”中运行,因为系统运行并执行它,因此他不共享主容器进程的 bash 持有的那些 ENV 变量。

    所以我假设(如果不是,请提供反馈)烧瓶在他的“自己的世界”中也以类似的方式运行,并且无法访问 Docker 设置的那些 ENV。

    因此,我创建了 bash 脚本来读取所有 ENV 变量并将它们写入项目的 .env 文件,该脚本在容器创建后运行。

    这样,无论您从何处以及如何运行代码/脚本……那些 ENV 变量将始终存在。

    【讨论】:

      猜你喜欢
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      • 2019-09-11
      • 2016-12-23
      • 2015-06-17
      • 2021-10-06
      相关资源
      最近更新 更多