Docker Compose绑定挂载配置导致证书文件找不到问题求助
Docker Compose绑定挂载导致FastAPI证书找不到问题分析
问题场景
你的Docker Compose配置如下:
server: container_name: server image: mydockerimg command: ["python3.8", "-m", "uvicorn", "main:app", "--host=0.0.0.0", "--ssl-keyfile=./key.pem", "--ssl-certfile=./cert.pem"] ports: - 8000:8000 working_dir: /app volumes: - ./:/app - mydata:/app/my_data/
使用mkcert生成本地开发证书后,执行docker compose up出现以下错误:
server | File "/usr/local/lib/python3.8/site-packages/uvicorn/config.py", line 139, in create_ssl_context server | ctx.load_cert_chain(certfile, keyfile, get_password) server | FileNotFoundError: [Errno 2] No such file or directory
无绑定挂载时服务可正常启动,以下是三者的影响关系分析:
证书、绑定挂载与服务的影响关系
- 无绑定挂载时的正常逻辑:你的镜像
mydockerimg内置了证书文件,容器工作目录设为/app,启动命令里的./key.pem和./cert.pem会指向容器内/app目录下的证书,所以服务能正常加载证书启动。 - 绑定挂载覆盖容器目录引发的问题:你配置的
./:/app绑定挂载,会将本地主机当前目录的内容完全覆盖容器内的/app目录。如果本地主机当前目录中没有存放mkcert生成的证书文件,容器内/app下就找不到对应的key.pem和cert.pem,从而触发文件找不到的错误。 - 命名卷的无关性:
mydata:/app/my_data/是Docker命名卷,仅挂载到容器内/app/my_data/目录,不会影响/app根目录下的证书文件,因此和本次错误无关。
解决方案
- 将本地mkcert生成的
key.pem和cert.pem复制到主机当前目录下,这样绑定挂载后,容器内/app目录会同步到这两个证书文件。 - 修改绑定挂载路径,避免覆盖整个
/app目录,比如只挂载代码目录:./src:/app/src,保留容器内/app原有的证书文件。 - 调整证书存放路径:将本地证书放到单独目录(比如
./certs/),在compose中添加挂载./certs:/certs,同时修改启动命令的证书路径为--ssl-keyfile=/certs/key.pem --ssl-certfile=/certs/cert.pem,让容器从指定挂载目录加载证书。
内容的提问来源于stack exchange,提问作者redd
相关产品推荐
相关产品推荐

