如何通过docker-compose.yml为已部署的Docker Stack指定日志文件?
解决Docker Swarm Stack服务间歇性崩溃无日志的问题
当然可以通过docker-compose.yml(或者Swarm部署专用的docker-stack.yml)配置可轮转的日志,这样就能捕获到服务崩溃前后的关键日志信息了。结合你使用的Docker 17.09.0-ce版本,下面是具体的实现方案:
配置可轮转的日志驱动
Docker默认采用json-file日志驱动,但默认不开启自动轮转。你可以在服务定义中添加logging字段,自定义轮转规则,既避免日志无限占用磁盘,又能保留足够的历史记录用于排查问题。
示例docker-stack.yml配置
version: '3.3' # 该版本与Docker 17.09.0-ce完全兼容 services: your-target-service: image: your-app-image:latest # 你的其他服务配置(比如ports、deploy、volumes等) logging: driver: "json-file" options: max-size: "10m" # 单个日志文件最大10MB,达到上限自动触发轮转 max-file: "5" # 最多保留5个轮转后的日志文件,超出则删除最旧的 compress: "true" # 对轮转后的旧日志进行gzip压缩,节省磁盘空间
参数详解
max-size: 单个日志文件的大小阈值,支持k(KB)、m(MB)、g(GB)单位,可根据你的日志输出量调整。max-file: 保留的日志文件总数,确保不会因为过多历史日志占用大量磁盘。compress: 开启后,轮转完成的旧日志会自动压缩,进一步降低磁盘占用。
将配置应用到已部署的Stack
如果你的Stack已经在线运行,只需更新配置文件后重新执行部署命令即可:
docker stack deploy -c docker-stack.yml your-stack-name
Swarm会自动执行滚动更新,新的日志配置会立即应用到所有新启动的容器实例。
查看日志的两种方式
- 实时追踪服务日志:
docker service logs -f your-stack-name_your-target-service - 直接访问节点本地日志文件:每个容器的日志存储在节点的
/var/lib/docker/containers/<container-id>/<container-id>-json.log*路径下,轮转后的文件会带有数字后缀(比如xxx-json.log.1.gz)。
额外提示
- 这些日志存储在容器运行节点的本地磁盘,如果你需要跨节点集中管理日志,可以考虑
syslog或fluentd等集中式日志驱动,但针对间歇性崩溃排查场景,本地轮转日志已经足够。 - 配置生效后,后续服务崩溃时,相关日志会被保留在轮转文件中,你可以通过时间戳定位到崩溃前后的关键输出。
内容的提问来源于stack exchange,提问作者lurscher
相关产品推荐
相关产品推荐

