Docker容器中Python应用读取本地配置文件失败问题排查
问题原因
- 你的
full_path函数错误地将用户传入的相对路径与Python包的安装目录(即cli.py所在的/usr/local/lib/python3.7/dist-packages/myapp/)拼接,而非基于容器的当前工作目录(/home/myapp)解析路径。 - 通过
pip install .安装应用后,__file__指向系统包目录中的cli.py,而非项目源码目录的文件。因此os.path.dirname(__file__)返回包安装路径,导致传入的./accounts.yaml被解析为/usr/local/lib/python3.7/dist-packages/myapp/accounts.yaml,自然找不到挂载在/home/myapp下的配置文件。
解决方案
以下两种方案任选其一即可:
方案1:修改路径解析逻辑,基于当前工作目录处理相对路径
修改cli.py中的full_path函数,直接将相对路径转换为基于当前工作目录的绝对路径:
import os def full_path(string: str): # 基于当前工作目录解析绝对路径,而非脚本所在目录 return os.path.abspath(string)
修改后,用户传入的./accounts.yaml会被解析为容器工作目录/home/myapp/accounts.yaml,与挂载的文件路径完全匹配。
方案2:移除自动路径转换,保留原生路径解析逻辑
如果不需要自动路径转换,可直接去掉argparse参数中的type=full_path,让系统自动基于当前工作目录解析相对路径:
def myapp_args(parser: argparse.ArgumentParser): parser.add_argument("-accounts", default="../accounts.yaml", help="Specify the Yaml file containing the accounts information") return parser.parse_args()
此时运行容器时,传入的./accounts.yaml会直接指向当前工作目录(/home/myapp)下的文件,无需额外转换。
内容的提问来源于stack exchange,提问作者net_programmer
相关产品推荐
相关产品推荐

