我执行此操作是为了使用 terraform 在本地构建 docker 镜像。第一次运行成功,但每次尝试都会失败,Error: failed to read dockerfile: unexpected EOF
除非我完全手动删除该terraform.tfstate
文件。
terraform {
backend "local" {}
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~>3.0.2"
}
# other providers
}
provider "docker" {
}
resource "docker_image" "dbx_kedro_img" {
name = "docker-build-test:latest"
build {
context = "."
dockerfile = "./Dockerfile"
}
}
我尝试将版本修改为docker-build-test:latest2
或docker-build-test2:latest
,运行terraform state rm docker_image.dbx_kedro_img
,删除本地 docker 镜像和容器,但没有成功。唯一有效的方法是手动删除terraform.tfstate
。欢迎提出任何想法。
docker rm $(docker ps -aq) # not useful
docker rmi $(docker images -q) -f # idem
terraform state rm docker_image.dbx_kedro_img # idem
我的docker文件:
# Use a lightweight base image
FROM alpine:latest
#
# Set the command to run when the container starts
CMD ["echo", "Hello, World3!"]
编辑:添加这样的触发器后,行为相同,第一次尝试后失败,即使修改了图像名称。
# not useful
resource "docker_image" "dbx_kedro_img" {
name = "docker-build-test5:latest"
build {
context = "."
dockerfile = "./Dockerfile"
}
triggers = {
always_rebuild = timestamp()
}
}
我查看了提供程序,并在调试模式下运行了它。我复制的问题是这样的。我创建了一个目录并向其中添加了两个文件。
Dockerfile
并且main.tf
我运行 terraform apply
我更新了 main.tf 中的标签并再次运行应用,但出现错误。
然后我
TF_LOG=debug
再次设置并运行应用。幸运的是,提供商已经编写了一些不错的日志记录,因此我们可以看到这里发生了什么。本质上,这里发生的事情是将状态文件写入当前目录。与 dockerfile 和上下文相同。因此,当您第二次运行 apply 时,现在状态文件正在尝试包含在要发送到 docker 套接字的上下文中。但是,状态文件已被操作系统上的 terraform 进程锁定。因此无法添加到 docker 上下文中。
这导致在读取 docker 文件时出现关于意外 EOF 的模糊错误。
如果我将我的 Docker 文件放在子目录中,并将我的上下文和 docker 文件设置为子目录,一切似乎都运行良好。
在我运行 terraform apply 更改标签名称后,我得到了