在 docker swarm 中,secret 更新后无法直接对单个 secret 执行回滚操作,因为 secret 的变更是全局且不可逆的。要恢复旧版本,必须手动重新创建该 secret 并指定旧版本的 base64 编码内容,然后强制更新所有依赖该 secret 的服务以应用新的 secret id。

如何获取并准备旧版 Secret 数据
首先需要从当前运行的服务中提取已更新的 Secret 内容,或者从本地备份中找回旧数据。由于 Swarm 不保留 Secret 的历史版本,你必须确保拥有旧数据的 Base64 编码字符串。如果之前没有备份,可以通过查看服务配置中的 Secret ID 来确认当前状态,但无法直接通过 API 回退到之前的 ID。

echo "old_secret_data" | base64 # 输出: b2xkX3NlY3JldF9kYXRhCg==
假设旧数据的 Base64 编码为 b2xkX3NlY3JldF9kYXRhCg==,你需要将其保存以便后续使用。这一步是关键,因为一旦新 Secret 被创建并应用,旧的 Secret 对象在 Swarm 中虽然可能仍然存在(取决于清理策略),但服务已经绑定到了新的 Secret ID,因此必须显式地用旧数据重建一个 Secret 对象。
如何强制服务重新挂载旧版 Secret
创建完包含旧数据的 Secret 后,需要更新所有使用该 Secret 的服务。Docker Swarm 不会自动检测 Secret 内容的变化并重启服务,因此必须手动触发更新。使用 docker service update 命令并添加 --secret-rm 和 --secret-add 参数,或者简单地重新指定相同的 Secret 名称以强制服务重新评估配置。

docker secret create old_secret.txt <<EOF b2xkX3NlY3JldF9kYXRhCg== EOF docker service update --secret-rm my_secret --secret-add source=old_secret,target=my_secret my_service
上述命令首先创建一个名为 old_secret.txt 的新 Secret,其内容为旧数据。接着,通过 docker service update 移除原有的 my_secret 挂载,并重新添加 old_secret.txt 作为 my_secret 挂载到容器中。这样,服务容器内的文件内容将恢复为旧版本。注意,如果服务配置中使用了 file 驱动,容器内的路径权限和内容会立即反映这一变化。若需验证,可进入容器检查文件内容是否已回滚。


















