如何配置Docker使Terragrunt二进制文件实现非交互式正确执行?
问题描述
我可以通过以下命令在Docker容器内交互式执行Terragrunt二进制文件,操作完全正常:
$ docker run -ti --rm -v $HOME/.aws:/root/.aws -v ${HOME}/.ssh:/root/.ssh -v `pwd`:/apps -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e AWS_SESSION_TOKEN alpine/terragrunt:0.13.6 bash
进入容器后,切换到Terragrunt配置文件所在目录执行命令:
bash-5.0# cd environments/assembly/us-east-1/sqs/ss-error-generic-encrypted/core/ bash-5.0# terragrunt init -reconfigure;terragrunt plan
但当我尝试通过脚本(如Jenkins任务)非交互式执行时,使用了以下命令:
$ docker run -ti --rm -v $HOME/.aws:/root/.aws -v ${HOME}/.ssh:/root/.ssh -v `pwd`:/apps -w /apps/environments/assembly/us-east-1/sqs/ss-error-generic-encrypted/core -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e AWS_SESSION_TOKEN alpine/terragrunt:0.13.6 terragrunt init -reconfigure; terragrunt plan
却出现错误,提示找不到terragrunt.hcl文件:
[terragrunt] 2022/08/27 11:12:14 Error reading file at path /Users/chewmanfoo/bitbucket.org/aws-terraform-infrastructure/terragrunt.hcl: open /Users/chewmanfoo/bitbucket.org/aws-terraform-infrastructure/terragrunt.hcl: no such file or directory
我原本以为-w参数会设置容器内的工作目录,让Terragrunt在正确位置执行,但实际结果不符,求解决方法。
解决方法
问题出在命令里的分号;上——这个分号会被宿主机的shell解析,导致terragrunt plan是在宿主机上执行,而不是在容器内部。这就解释了为什么会出现宿主机路径的错误,因为第二个命令根本没进入容器。
修正方法有两种:
- 把整个Terragrunt命令用引号包裹,让容器内的shell来执行:
注意:非交互式场景无需$ docker run --rm -v $HOME/.aws:/root/.aws -v ${HOME}/.ssh:/root/.ssh -v `pwd`:/apps -w /apps/environments/assembly/us-east-1/sqs/ss-error-generic-encrypted/core -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e AWS_SESSION_TOKEN alpine/terragrunt:0.13.6 sh -c "terragrunt init -reconfigure && terragrunt plan"-ti参数;用&&代替;,确保前一个命令执行成功后再运行下一个;通过sh -c来执行引号内的命令串。 - 拆成两个独立的
docker run调用(不推荐,效率较低):$ docker run --rm -v $HOME/.aws:/root/.aws -v ${HOME}/.ssh:/root/.ssh -v `pwd`:/apps -w /apps/environments/assembly/us-east-1/sqs/ss-error-generic-encrypted/core -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e AWS_SESSION_TOKEN alpine/terragrunt:0.13.6 terragrunt init -reconfigure $ docker run --rm -v $HOME/.aws:/root/.aws -v ${HOME}/.ssh:/root/.ssh -v `pwd`:/apps -w /apps/environments/assembly/us-east-1/sqs/ss-error-generic-encrypted/core -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e AWS_SESSION_TOKEN alpine/terragrunt:0.13.6 terragrunt plan
另外,请确认宿主机当前目录(pwd)下是否存在environments/assembly/us-east-1/sqs/ss-error-generic-encrypted/core/terragrunt.hcl文件,确保挂载路径正确。
内容的提问来源于stack exchange,提问作者Jason Michael
相关产品推荐
相关产品推荐

