Docker Compose中应用容器Secret为空,数据库容器正常问题排查
以下是针对该问题的具体排查方向:
文件权限与容器运行用户不匹配
检查宿主机/mnt/c/artifacts/settings.json的权限(执行ls -l /mnt/c/artifacts/settings.json),同时对比两个容器的运行用户(用docker inspect <容器ID/名称> | grep User查看)。数据库容器可能以root用户运行,能读取该文件;而应用容器如果用了非root用户,可能没有文件读取权限,导致挂载后生成空的Secret文件。Compose配置细节差异
仔细核对两个容器的Secret挂载配置,确认没有拼写错误、目标路径不存在或mode参数设置错误。比如应用容器的target路径如果指向容器内不存在的目录,可能导致挂载逻辑异常,生成空文件。示例对比:数据库容器配置:
secrets: - source: app_settings target: /etc/db/settings.json应用容器配置若误写为
target: /app/unknown/settings.json,就可能出现问题。WSL跨文件系统同步问题
你的Secret源路径/mnt/c/是WSL挂载的Windows目录,可能存在文件锁定、权限映射异常等问题。可以尝试将settings.json复制到WSL本地目录(比如/home/your-user/artifacts/),修改Compose中Secret的file路径为这个本地路径,重新部署验证是否还会出现空Secret的情况。容器启动异常引发的挂载问题
虽然你认为应用容器的启动异常不影响Secret挂载,但部分场景下容器启动失败后的重启、重建流程可能干扰Secret挂载逻辑。可以手动启动应用容器单独测试:docker run --rm --secret source=app_settings,target=/app/settings.json <你的应用镜像>启动后进入容器查看Secret文件内容,确认是否能正常读取。
Docker/Compose版本bug
旧版本的Docker或Docker Compose在处理跨文件系统的Secret挂载时可能存在已知bug。建议升级到最新稳定版的Docker Engine和Docker Compose,再重新部署测试。
内容的提问来源于stack exchange,提问作者Josef

