Docker容器执行Terraform init遇可疑仓库所有权错误求助
Docker容器中Terraform初始化Git权限错误解决
问题场景与代码
我通过Shell脚本在Docker容器内运行Terraform,相关函数代码如下:
Terraform容器运行函数
terraform() { docker run --rm -e \"AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID\" \ -e \"AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY\" \ -e \"AWS_SESSION_TOKEN=${AWS_SESSION_TOKEN:-\"\"}\" \ -e \"AWS_REGION=$AWS_REGION\" \ -e \"TF_IN_AUTOMATION=true\" \ -v \"$HOME/.kube:/root/.kube\" \ -v \"$PWD:/work\" -w /work \"$TERRAFORM_DOCKER_IMAGE\" \"$@\" } initialize_terraform() { docker build -f \"$(dirname \"$0\")/terraform.Dockerfile\" -t \"$TERRAFORM_DOCKER_IMAGE\" . && \ &>/dev/null pushd \"$INFRA_PATH\" terraform init \ -backend-config=\"bucket=$TERRAFORM_S3_BUCKET\" \ -backend-config=\"key=$TERRAFORM_S3_KEY\" }
对比可用的AWS容器函数
aws() { docker run --rm -e \"AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID\" \ -e \"AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY\" \ -e \"AWS_SESSION_TOKEN=${AWS_SESSION_TOKEN:-\"\"}\" \ -e \"AWS_REGION=$AWS_REGION\" \ -v \"$PWD:/work\" \ -v \"$HOME/.kube/config:/root/.kube/config\" \ -v \"/tmp:/tmp\" \ -w /work \ \"$AWS_DOCKER_IMAGE\" \"$@\" } aws eks list-clusters
错误信息
仅运行initialize_terraform时触发Git所有权验证错误,其他如aws命令可正常执行:
╷ │ Error: Failed to download module │ │ Could not download module \"explore-california-vpc\" (cluster.tf:39) source │ code from │ \"git::https://github.com/terraform-aws-modules/terraform-aws-vpc?ref=v5.1.1\": │ error downloading │ 'https://github.com/terraform-aws-modules/terraform-aws-vpc?ref=v5.1.1': │ /usr/bin/git exited with 128: fatal: detected dubious ownership in │ repository at '/work/.terraform/modules/explore-california-vpc' │ To add an exception for this directory, call: │ │ git config --global --add safe.directory │ /work/.terraform/modules/explore-california-vpc │ . ╵
尝试过不切换到$INFRA_PATH目录,问题依然存在,且不希望每次手动添加安全目录。
解决方案
1. 容器运行时匹配宿主机用户UID/GID(推荐)
Docker默认以root用户运行容器,挂载目录的所有者是宿主机普通用户,导致Git触发安全校验。修改terraform函数,添加-u $(id -u):$(id -g)参数,让容器内用户与宿主机当前用户权限一致:
terraform() { docker run --rm -u $(id -u):$(id -g) \ -e \"AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID\" \ -e \"AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY\" \ -e \"AWS_SESSION_TOKEN=${AWS_SESSION_TOKEN:-\"\"}\" \ -e \"AWS_REGION=$AWS_REGION\" \ -e \"TF_IN_AUTOMATION=true\" \ -v \"$HOME/.kube:/root/.kube\" \ -v \"$PWD:/work\" -w /work \"$TERRAFORM_DOCKER_IMAGE\" \"$@\" }
2. 自定义镜像时预设Git安全目录
在terraform.Dockerfile中添加Git全局配置,将/work目录标记为安全:
FROM hashicorp/terraform:latest # 按需添加其他依赖 RUN git config --global --add safe.directory /work # 或者允许所有目录(适合自动化场景) # RUN git config --global --add safe.directory '*'
重新构建镜像后,Terraform下载模块时就不会触发所有权校验。
3. 初始化前临时配置安全目录
在initialize_terraform中先执行Git配置命令,再运行terraform init:
initialize_terraform() { docker build -f \"$(dirname \"$0\")/terraform.Dockerfile\" -t \"$TERRAFORM_DOCKER_IMAGE\" . && \ &>/dev/null pushd \"$INFRA_PATH\" terraform sh -c 'git config --global --add safe.directory /work/.terraform/modules/* && terraform init \ -backend-config=\"bucket=$TERRAFORM_S3_BUCKET\" \ -backend-config=\"key=$TERRAFORM_S3_KEY\"' }
原因说明
Git的dubious ownership校验是为了防止恶意目录被执行。容器内root用户访问宿主机普通用户拥有的挂载目录时,Git检测到所有者不一致,判定为可疑目录。AWS命令未触发问题是因为不需要执行Git克隆操作,而Terraform初始化时需要下载Git托管的模块,因此触发了该安全机制。
内容的提问来源于stack exchange,提问作者ThrmsNPrfs
相关产品推荐
相关产品推荐

