Estou executando isso para construir localmente uma imagem docker usando o Terraform. Obtém sucesso na primeira execução, mas falha em todas as outras tentativas, Error: failed to read dockerfile: unexpected EOF
a menos que eu remova o terraform.tfstate
arquivo completa e manualmente.
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"
}
}
Tentei modificar a versão para docker-build-test:latest2
ou docker-build-test2:latest
, executando terraform state rm docker_image.dbx_kedro_img
, removendo as imagens e contêineres do docker locais, sem sucesso. A única coisa que funciona é excluir manualmente o terraform.tfstate
. Qualquer ideia é bem-vinda.
docker rm $(docker ps -aq) # not useful
docker rmi $(docker images -q) -f # idem
terraform state rm docker_image.dbx_kedro_img # idem
meu dockerfile:
# Use a lightweight base image
FROM alpine:latest
#
# Set the command to run when the container starts
CMD ["echo", "Hello, World3!"]
EDIT: mesmo comportamento após adicionar um gatilho como este, falha após a primeira tentativa, mesmo ao modificar o nome da imagem.
# not useful
resource "docker_image" "dbx_kedro_img" {
name = "docker-build-test5:latest"
build {
context = "."
dockerfile = "./Dockerfile"
}
triggers = {
always_rebuild = timestamp()
}
}
Dei uma olhada no provedor e também o executei no modo de depuração. O problema conforme repliquei é assim. Criei um diretório e adicionei a ele dois arquivos.
Dockerfile
emain.tf
Eu executo o Terraform Apply
Atualizo a tag no main.tf e executo o apply novamente, mas dá erro.
Eu então configurei
TF_LOG=debug
e executei o apply novamente. Felizmente, o provedor escreveu um registro decente para que possamos ver o que está acontecendo aqui.Essencialmente, o que está acontecendo aqui é que o arquivo de estado é gravado no diretório atual. O mesmo que o dockerfile e o contexto. Então, quando você executa o apply uma segunda vez, agora os arquivos de estado estão tentando ser incluídos no contexto para serem enviados ao soquete do docker. No entanto, os arquivos de estado já estão bloqueados pelo processo do Terraform no SO. Portanto, não podem ser adicionados ao contexto do docker.
Isso resulta no erro ambíguo sobre EOF inesperado ao ler o arquivo docker.
se eu colocar meu arquivo Docker em um subdiretório e definir meu contexto e arquivo Docker no subdiretório, tudo parece funcionar bem.
Depois que executo o terraform apply ao alterar o nome da tag, recebo