EC2上CircleCI部署的Docker容器日志未写入挂载文件求助
问题分析
你混淆了Docker日志驱动和应用自身文件日志的边界:
--log-driver none只是关闭Docker对容器stdout/stderr的日志收集(所以docker logs无输出、LogPath为空是正常行为),但完全不影响应用自行写入挂载目录的文件日志。- 移除该参数后
docker logs能看到日志,说明你的Python服务实际是把日志输出到了stdout/stderr,而非你预期的/app/log目录下的文件——这才是日志没出现在挂载路径的核心原因。
解决方案
1. 检查Python logging配置
确认代码里的日志模块是否真的配置了写入/app/log/{服务名}.log文件,而非默认输出到控制台。举个正确配置的示例:
import logging from logging.handlers import RotatingFileHandler logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) # 配置文件处理器,指定输出到容器内的/app/log路径 file_handler = RotatingFileHandler('/app/log/my_service.log') formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') file_handler.setFormatter(formatter) logger.addHandler(file_handler)
如果之前能正常生成文件日志,检查代码是否被修改,或是否有环境变量覆盖了日志路径配置。
2. 验证挂载目录权限
- 进入容器检查
/app/log的权限:docker exec -it <容器ID> ls -ld /app/log - 确保容器内运行Python服务的用户(默认root,或你指定的非root用户)拥有该目录的读写权限。如果权限不足,在EC2上给宿主机目录提前设置权限:
# 简单测试用777,生产环境建议指定容器用户的UID/GID sudo chmod 777 /vol/log/${CIRCLE_PROJECT_REPONAME}
3. 确认挂载命令正确性
检查deploy.sh中的docker run挂载参数是否正确,路径无拼写错误:
docker run -d \ -v /vol/log/${CIRCLE_PROJECT_REPONAME}:/app/log \ --log-driver none \ <你的镜像名>
同时在EC2上确认宿主机目录存在:ls /vol/log/${CIRCLE_PROJECT_REPONAME}
4. 临时调试排查
- 启动容器时去掉
-d参数,前台运行看控制台是否有日志写入失败的报错(比如权限不足):docker run \ -v /vol/log/${CIRCLE_PROJECT_REPONAME}:/app/log \ --log-driver none \ <你的镜像名> - 手动在容器内创建测试文件,验证挂载同步是否正常:
如果测试文件能同步到宿主机,说明挂载没问题,问题肯定在Python日志配置;如果看不到,说明挂载命令或宿主机目录存在问题。docker exec -it <容器ID> touch /app/log/test.log # 然后在EC2上检查: ls /vol/log/${CIRCLE_PROJECT_REPONAME}/test.log
内容的提问来源于stack exchange,提问作者ShwetaJ
相关产品推荐
相关产品推荐

