使用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") }
问题分析
- Docker构建上下文配置错误:
docker_image的build.context参数应指向包含构建所需文件的目录,而非单个Dockerfile路径。原代码将context设为Dockerfile路径,导致Terraform的Docker Provider无法正确读取构建上下文,触发403错误。 - 冗余资源:
local_file资源完全多余,它仅将index.html内容写回原文件,复制文件的操作应由Dockerfile完成。 - 路径问题: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. 重新执行部署
- 进入Devops目录,执行
terraform init初始化环境 - 执行
terraform apply确认部署 - 访问
http://localhost:5000验证(注意:nginx默认使用HTTP协议,无需HTTPS)
额外注意事项
- 确保Windows 11上的Docker Desktop已正常启动,且当前用户有权限访问Docker
- 若仍有问题,可尝试重启Docker Desktop后重新执行命令
内容的提问来源于stack exchange,提问作者Rhishikesh12
相关产品推荐
相关产品推荐

