【问题标题】:dotenv celery docker container not updating immediately after change in .env file.env 文件更改后,dotenv celery docker 容器未立即更新
【发布时间】:2021-03-19 07:04:27
【问题描述】:

我在 docker celery 容器中使用 dotenv。
容器的代码如下。

在两次运行之间,我将 .env1 的内容从 LOGGING_CONF_FILE=logging1.yamlLOGGING_CONF_FILE=logging2.yaml

然后我触摸文件__init__.py,触发重新加载应用程序

我希望在控制台中看到:LOGGING_CONF_FILE10 logging2.yaml,但我仍然看到 LOGGING_CONF_FILE10 logging1.yaml

如果我再次触摸文件__init__.py,这会触发应用程序的再次重新加载, 我确实在控制台中看到:LOGGING_CONF_FILE10 logging2.yaml 符合预期。

  1. 为什么 dotenv 没有立即获取 .env1 文件中的更改?
  2. 另外,为什么“os.unsetenv”和“os.putenv”没有取消设置变量? 当我打印 LOGGING_CONF_FILE 的值时,我得到了一些值(而不是在空字符串上未定义)。

谢谢

cat .env1
...
LOGGING_CONF_FILE=logging1.yaml
def create_app(config_class=Config):
    print( 'BEG create_app' )

    app = Flask(__name__)
    # app.app_context().push()

    app.config.from_object(config_class)

    from app.errors import bp as errors_bp
    app.register_blueprint(errors_bp)

    db.init_app(app)
    mail.init_app(app)
    bootstrap.init_app(app)
    pagedown.init_app(app)
    migrate.init_app(app, db)
    # auth = HTTPBasicAuth()
    # auth_token = HTTPBasicAuth()
    login.init_app(app)

    class ContextTask(celery.Task):
        def __call__(self, *args, **kwargs):
            with app.app_context():
                return self.run(*args, **kwargs)

    celery.conf.update(app.config)
    celery.Task = ContextTask
...

【问题讨论】:

    标签: docker flask celery dotenv


    【解决方案1】:

    问题是我在 2 个地方调用了 load_dotenv。
    在第一次/第二次调用中,它在没有/使用选项“override=True”的情况下被调用。
    两个 load_dotenv 调用相互竞争,第一个调用尊重现有的 os 变量,而另一个调用覆盖了它们。
    这导致环境变量的值无法预测。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多