Docker Swarm创建新容器时的Secrets问题求助
解决Docker Swarm服务无法加载Secret的问题
结合你提供的生产环境信息和报错细节,我来帮你一步步排查这个问题:
1. 验证Secret在所有Manager节点的同步状态
Docker Swarm的Secret存储在Manager节点的Raft数据库中,所有Manager必须保持数据同步。你需要在每个Manager节点上执行以下命令,确认Secret存在:
docker secret inspect vb8485hcixfhnqrp29m8lrfm2
如果某个Manager节点返回secret not found,说明该节点的Raft同步出现异常:
- 检查节点间的集群通信端口(2377/tcp、7946/tcp/udp、4789/udp)是否正常连通
- 重启异常的Manager节点,等待它重新加入集群同步数据
2. 检查Worker节点的Secret同步与Docker日志
Worker节点需要从Manager拉取Secret才能挂载到容器中,虽然Worker无法直接查看Secret,但可以通过以下方式排查:
- 查看Worker节点的Docker服务日志,搜索与目标Secret相关的错误:
日志中可能会出现拉取失败、权限不足或存储异常的信息。journalctl -u docker.service | grep vb8485hcixfhnqrp29m8lrfm2 - 检查Worker节点的Secret存储目录是否存在对应文件:
如果没有该文件,说明Worker未成功拉取Secret,尝试重启Worker节点的Docker服务:ls /var/lib/docker/swarm/secrets/ | grep vb8485hcixfhnqrp29m8lrfm2
重启后再执行systemctl restart dockerdocker service update --force ${service_name}测试。
3. 排查Btrfs存储层的兼容性问题
你使用的Docker版本(17.12.1-ce)和Btrfs版本(v4.9.1)可能存在潜在的兼容性问题,Docker日志中可能会有Btrfs相关的错误信息。可以:
- 查看Docker启动和运行日志,搜索
btrfs关键词,确认没有挂载失败、磁盘权限或文件系统错误:journalctl -u docker.service | grep btrfs - 检查节点磁盘空间是否充足,Btrfs文件系统是否健康:
btrfs filesystem df /var/lib/docker btrfs check --readonly /dev/your-btrfs-device
4. 用测试Secret验证集群功能
为了排除当前Secret本身的问题,你可以创建一个测试Secret并部署简单服务验证:
# 创建测试Secret echo "test-content" | docker secret create test-secret - # 部署使用该Secret的测试服务 docker service create --name test-service --secret test-secret alpine sleep 3600
如果测试服务能正常启动,说明集群的Secret功能正常,问题可能出在原Secret的配置或同步异常上;如果测试服务也失败,那大概率是集群层面的通信或存储问题。
5. 检查服务调度与节点状态
执行docker service ps ${service_name}查看服务任务的调度节点,确认任务是否被调度到了状态异常的节点上:
- 用
docker node ls检查所有节点的状态是否为Ready,如果有节点显示Down或Unavailable,将服务调度到正常节点测试:docker service update --constraint-add node.hostname=<正常节点主机名> ${service_name}
内容的提问来源于stack exchange,提问作者xHybridC
相关产品推荐
相关产品推荐

