docker - .env 文件更改后,dotenv celery docker 容器未立即更新
问题描述
我在 docker celery 容器中使用 dotenv。
该容器具有以下代码。
在两次运行之间,我将 .env1 的内容从更改
LOGGING_CONF_FILE=logging1.yaml
为LOGGING_CONF_FILE=logging2.yaml
然后我触摸__init__.py
触发重新加载应用程序的文件
我希望在控制台中看到:LOGGING_CONF_FILE10 logging2.yaml
但我仍然看到LOGGING_CONF_FILE10 logging1.yaml
如果我再次触摸该文件__init__.py
,这会触发应用程序的再次重新加载,我确实会在控制台中看到:LOGGING_CONF_FILE10 logging2.yaml
正如预期的那样。
- 为什么 dotenv 没有立即获取 .env1 文件中的更改?
- 另外,为什么“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
...
解决方案
问题是我在 2 个地方调用了 load_dotenv。
在第一次/第二次调用中,它在没有/使用选项“override=True”的情况下被调用。
两个 load_dotenv 调用相互竞争,第一个调用尊重现有的 os 变量,而另一个调用覆盖了它们。
这导致环境变量的值不可预测。
推荐阅读
- xml - 在 XSLT 中的处理指令之间抓取文本
- python - 如何返回一个整数列表,该列表计算满足给定条件的字符串列表列表中的字符串总数?
- android - 防止firestore中的重复条目
- html - 我可以向下滚动,但没有内容
- dataframe - pyspark 使用每个 id 的最小值过滤数据帧
- javascript - 目标特定类别 + 数字
- python - Discord 机器人不会接收新消息
- amazon-web-services - 在 AWS Glue 火花上下文中的 DynamicFrameWriter 中使用 from_options 时没有扩展
- laravel - Laravel 以自定义顺序在 Blade 中分块一个集合
- docker - 使用 compose 重新创建命名卷