首页 > 解决方案 > .env 文件更改后,dotenv celery docker 容器未立即更新

问题描述

我在 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
...

标签: dockerflaskcelerydotenv

解决方案


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


推荐阅读