You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 03:17:08