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

在BitBucket Pipeline中使用Terraform的kreuzwerker/docker provider构建Docker镜像至ECR时文件未被复制的问题

在BitBucket Pipeline中使用Terraform的kreuzwerker/docker provider构建Docker镜像至ECR时文件未被复制的问题

我之前也碰到过一模一样的问题,这大概率是kreuzwerker/docker provider(原terraform-providers/docker)在BitBucket Pipeline这种容器化运行环境下的权限映射冲突导致的。

问题根源分析

BitBucket Pipeline本身就是运行在容器里的,当你用Terraform的docker provider在这个容器内构建镜像时,它会和宿主机的Docker daemon交互。而日志里的这条报错是关键:

level=error msg="Can't add file /var/lib/docker/165536.165536/overlay2/lzpejtjd0vm6y4cmqc3ckrsw1/diff/myfile.txt to tar: Host ID 0 cannot be mapped to a container ID"

这说明构建过程中,文件的root用户(UID 0)无法在容器环境和宿主机Docker daemon之间正确映射,导致COPY操作看似成功,但实际上文件并没有被真正添加到镜像层里。而本地环境没有这个问题,是因为本地的Docker daemon直接运行在物理机/虚拟机上,权限映射逻辑更简单。

解决方案

方案1:沿用你的临时 workaround(最稳定)

用null_resource配合local-exec直接调用原生Docker命令,绕过Terraform docker provider的权限问题,这也是目前最可靠的方式。你的代码可以整理成这样:

resource "null_resource" "docker_packaging" {
  provisioner "local-exec" {
    command = <<EOF
echo ${local.ecr_tkn} | docker login --username AWS --password-stdin ${data.aws_ecr_authorization_token.ecr_token.proxy_endpoint}
docker build -t "${aws_ecr_repository.repo.repository_url}:latest" -f ${var.code_path}/Dockerfile ${var.code_path}
docker push "${aws_ecr_repository.repo.repository_url}:latest"
EOF
  }
}

这种方式直接在Pipeline容器内执行Docker命令,和你本地操作逻辑完全一致,权限映射不会出问题。

方案2:调整Terraform Docker Provider配置(尝试修复)

如果你想继续使用terraform docker provider,可以尝试以下两个调整:

  1. 给BitBucket Pipeline步骤添加特权模式
    在你的bitbucket-pipelines.yml里,执行terraform apply的步骤中添加privileged: true,让容器拥有足够权限处理Docker构建的映射:
    steps:
      - step:
          name: Terraform Apply
          image: hashicorp/terraform:latest
          services:
            - docker
          privileged: true  # 新增这一行
          script:
            - terraform init
            - terraform apply -auto-approve
    
  2. 在Docker镜像构建时指定用户参数
    在Terraform的docker_image资源的build块里添加args,强制以root用户构建:
    resource "docker_image" "my_image" {
      name = "${aws_ecr_repository.my_repo.repository_url}:latest"
    
      build {
        context = "../../apps/dockertest"
        args = ["--user=root"]  # 新增这一行
      }
    }
    

额外验证步骤

在Pipeline执行前,可以先加一个步骤验证构建上下文的文件是否存在:

steps:
  - step:
      name: Check Build Context
      script:
        - ls -la ../../apps/dockertest
        - cat ../../apps/dockertest/myfile.txt

确认文件确实存在且权限正常,排除路径或文件本身的问题。

备注:内容来源于stack exchange,提问作者NullPointer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 12:14:39