问题描述
在使用Terraform时遇到了一个问题:在配置文件中的多个位置都需要设置变量,如果从其中一个位置删除变量定义,就会出现“Unsupported argument”错误。用户不清楚在这种情况下哪个变量会起作用,也不明白为什么需要同时设置两组变量。
解决方案
请注意以下操作可能受版本差异影响,如有需要请查阅官方文档或更新的资源。
方案1
Terraform中每个模块都有自己的输入变量。根模块的输入变量是在运行Terraform时设置的,比如可以使用命令行的-var
选项。而子模块的输入变量则在module
块内设置。
对于你的场景,根模块使用了一个名为env
的变量,子模块(module "logs"
)也使用了同样的名字的变量。尽管这对人类读者来说是合理的,因为它们表示相同的概念,但是Terraform认为这两个变量是完全独立的,所以需要在两个位置都定义和设置它们。
可以将模块类比为编程语言中的函数。每个函数都定义了自己的参数,两个函数可能会有相同名称的参数,但它们仍然是不同的,因为它们属于不同的函数:
# 在这个类比中,module "logs" 就相当于一个函数
function main(env: string) {
logs(env)
}
function logs(env: string) {
// 这里的 "env" 变量是 "test",因为它通过参数传递给了这两个函数,
// 而不是因为这两个函数中的参数偶然具有相同的名称。
}
// 对于这个类比,运行 main 相当于执行 terraform apply -var="env=test"
main("test")
方案2
另一种方法是使用脚本或工具来管理容器的启动顺序。这可能会增加一些复杂性,但是可以精确控制容器A和容器B的启动顺序。以下是一个简单的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
。
这种方法需要手动管理容器的启动顺序,但可以确保容器B在容器A之后启动。
请注意,具体操作可能因Docker版本、容器镜像等因素而有所不同,请根据实际情况做相应的调整。