问题描述
正在寻找一个中央配置管理框架,满足以下需求:
1. 支持期望状态配置。用户希望能够使用代码表达期望的配置,并且框架能够不断确保配置的一致性,以防止配置漂移。当然,框架应该支持拉取模式。
2. 所有配置都在源代码控制中进行管理(例如git)。即不使用临时脚本。
用户来自软件开发环境,在那里将代码放在版本控制之外是不可想象的。用户希望将DSC规范也同样对待 – 所有内容都在版本控制中,这样当任何人更改配置时,就可以轻松知道更改是在何时、为什么、如何以及由谁进行的。
用户已经开始研究Azure Automation DSC,但不确定它是否符合要求 – 参见Is it possible to keep all the DSC configurations in Version Control and make Azure Automation fetch it from there automatically?
用户的服务器是Windows Server,主要是2012R2,正在逐步引入2016。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
一个例子是使用Ansible工具,它允许您将所有配置定义为存储在源代码管理中的脚本,并且可以处理配置漂移。Ansible具有多种方式与Windows进行交互,包括通过运行脚本使用DSC。完整的信息可以在这里找到。
对于期望状态配置,可以参考这里的文档。
还有其他一些信息可以帮助确保系统保持在期望状态,重要的是确保编写脚本的方式本身不会对系统产生差异,可以参考这里的文章。
我知道许多环境都使用Ansible来定义和部署整个系统,并用它来消除任何配置漂移。
还有其他一些方法也可以帮助解决这个问题,包括使用动态配置来缩短系统的生命周期。只在测试或其他短时间内保持系统运行。
方案2
使用脚本或工具来管理配置可能会增加复杂性,并且需要确保配置的一致性。
另一种方法是编写脚本或使用工具来控制配置的运行顺序。您可以使用docker run
命令来手动控制容器的启动顺序,或者使用一些第三方工具来管理配置的依赖关系。
以下是一个简单的bash脚本示例,可以在容器A启动后启动容器B:
#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b
在这个示例中,我们首先使用docker run
命令启动容器A,并将其命名为container_a
。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo
命令来测试)。一旦容器A就绪,我们再使用docker run
命令启动容器B,并将其命名为container_b
。
以上是关于如何在Docker中运行容器B之前停止容器A的解决方案。希望对你有帮助!