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

使用docker_image资源时Terraform构建Docker镜像出现403错误求助

Terraform Docker构建报错403问题解决

问题场景

练习Terraform基础案例时,需完成以下操作:

  • 创建基于nginx:latest的Dockerfile
  • 将本地index.html复制到容器/usr/share/nginx/html目录
  • 构建名为Webserver的镜像,运行名为webcontainer的容器并映射端口5000
  • 验证访问http://localhost:5000

执行terraform apply时出现报错:

Error: failed to read downloaded context: failed to load cache key: invalid response status 403
│
│ with docker_image.webserver,
│ on main.tf line 13, in resource "docker_image" "webserver":
│ 13: resource "docker_image" "webserver" {

文件结构:

Devops
    - main.tf
    - index.html
    - Dockerfile

原代码:

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "3.0.2"
    }
  }
}

provider "docker" {}

# Build a Docker image
resource "docker_image" "webserver" {
  name         = "webserver"
  build {
    context    = "~/Desktop/Devops/Dockerfile"
    dockerfile = "~/Desktop/Devops/Dockerfile"
  }
}

# Run a Docker container
resource "docker_container" "webcontainer" {
  image = docker_image.webserver.image_id
  name  = "webcontainer"

  ports {
    internal = 80
    external = 5000
  }
}

# Copy index.html to the directory
resource "local_file" "index_html" {
  filename = "~/Desktop/Devops/index.html"
  content = file("~/Desktop/Devops/index.html")
}

问题分析

  1. Docker构建上下文配置错误:docker_image的build.context参数应指向包含构建所需文件的目录,而非单个Dockerfile路径。原代码将context设为Dockerfile路径,导致Terraform的Docker Provider无法正确读取构建上下文,触发403错误。
  2. 冗余资源:local_file资源完全多余,它仅将index.html内容写回原文件,复制文件的操作应由Dockerfile完成。
  3. 路径问题:Windows环境下使用~路径可能存在解析异常,建议使用相对路径更可靠。

修正方案

1. 修正main.tf配置

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "3.0.2"
    }
  }
}

provider "docker" {}

# Build a Docker image
resource "docker_image" "webserver" {
  name         = "webserver"
  build {
    context    = "."  # 当前目录作为构建上下文
    dockerfile = "./Dockerfile"  # 相对路径指向Dockerfile
  }
}

# Run a Docker container
resource "docker_container" "webcontainer" {
  image = docker_image.webserver.image_id
  name  = "webcontainer"

  ports {
    internal = 80
    external = 5000
  }
}

2. 确保Dockerfile内容正确

Dockerfile需包含复制index.html的指令:

FROM nginx:latest
COPY index.html /usr/share/nginx/html/

3. 重新执行部署

  1. 进入Devops目录,执行terraform init初始化环境
  2. 执行terraform apply确认部署
  3. 访问http://localhost:5000验证(注意:nginx默认使用HTTP协议,无需HTTPS)

额外注意事项

  • 确保Windows 11上的Docker Desktop已正常启动,且当前用户有权限访问Docker
  • 若仍有问题,可尝试重启Docker Desktop后重新执行命令

内容的提问来源于stack exchange,提问作者Rhishikesh12

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:35:01