Docker 容器内部的Terraform删除文件

Docker 容器内部的Terraform删除文件,docker,terraform,ubuntu-18.04,Docker,Terraform,Ubuntu 18.04,我发现我的Ubuntu18.04主机上的docker没有保留装载到主机容器中的文件 图像:hashicorp/terraform 我正在使用--mount将目录绑定到容器中,该目录是存储terraform配置文件的地方。然后我执行容器,该容器执行terraform,然后terraform写入其状态文件和所有其他内容。 在70%的情况下,这些文件在容器中无法保存。当容器运行时,我可以看到它们在主机上被创建,但是当容器完成它的工作时,文件就会消失。 那是码头工人还是地形问题 添加更多信息: dock

我发现我的Ubuntu18.04主机上的docker没有保留装载到主机容器中的文件

图像:
hashicorp/terraform

我正在使用
--mount
将目录绑定到容器中,该目录是存储terraform配置文件的地方。然后我执行容器,该容器执行terraform,然后terraform写入其状态文件和所有其他内容。
在70%的情况下,这些文件在容器中无法保存。当容器运行时,我可以看到它们在主机上被创建,但是当容器完成它的工作时,文件就会消失。
那是码头工人还是地形问题

添加更多信息:

docker run--mount type=bind,source='/home/david/demo',target=/demo-w/demo-it hashicorp/terraform plan-out tfstate

terraform version 
0.11.13

在阅读了所有关于你问题的评论之后,我将总结一下我是如何测试你的场景和结果的

我的docker版本:

Docker version 18.09.1, build 4c52b90
地形:

Terraform v0.11.13
+ provider.azurerm v1.24.0
我创建了一个包含main.tf文件的文件夹,配置如下:

provider "azurerm" {
    version = "=1.24.0"
    subscription_id = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
    client_id = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
    client_secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX="
    tenant_id = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}

resource "azurerm_resource_group" "rg" {
    name = "testResourceGroup"
    location = "westus"
}
我支持一个代理,所以我第一次执行了此操作,因为我连接到azure,所以我使用init来下载插件:

docker run --env HTTPS_PROXY="http://myproxyfqdn:port" --rm --mount type=bind,source='/Docker/NFS/terraform',target='/terraform' -w /terraform -it hashicorp/terraform:full init
# ls -ltra
-rw-r--r-- 1 root root  759 Apr 23 09:00 main.tf
drwxr-xr-x 3 root root 4096 Apr 23 09:09 .terraform
执行此操作后,我的主机上的文件夹刷新了创建.terraform文件夹的插件:

docker run --env HTTPS_PROXY="http://myproxyfqdn:port" --rm --mount type=bind,source='/Docker/NFS/terraform',target='/terraform' -w /terraform -it hashicorp/terraform:full init
# ls -ltra
-rw-r--r-- 1 root root  759 Apr 23 09:00 main.tf
drwxr-xr-x 3 root root 4096 Apr 23 09:09 .terraform
然后,我执行了带有-out参数的计划,该参数创建了我的计划文件供以后使用:

# docker run --env HTTPS_PROXY="http://myproxyfqdn:port" --rm --mount type=bind,source='/Docker/NFS/terraform',target='/terraform' -w /terraform -it hashicorp/terraform:full plan -out testplan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.


------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  + azurerm_resource_group.rg
      id:               <computed>
      location:         "westus"
      name:             "testResourceGroup"
      tags.%:           <computed>

Plan: 1 to add, 0 to change, 0 to destroy.
------------------------------------------------------------------------
然后应用terraform.tfstate创建的计划:

# docker run --env HTTPS_PROXY="http://myproxyfqdn:port" --rm --mount type=bind,source='/Docker/NFS/terraform',target='/terraform' -w /terraform -it hashicorp/terraform:full apply testplan
azurerm_resource_group.rg: Creating...
  location: "" => "westus"
  name:     "" => "testResourceGroup"
  tags.%:   "" => "<computed>"
azurerm_resource_group.rg: Creation complete after 2s (ID: /subscriptions/8d43a801-58b6-4dde-84cc-...c60e6/resourceGroups/testResourceGroup)

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

我没有遇到任何问题,每次执行都会更新主机文件夹上的数据。

在阅读了关于您问题的所有评论后,我将总结一下我是如何测试您的场景和结果的

我的docker版本:

Docker version 18.09.1, build 4c52b90
地形:

Terraform v0.11.13
+ provider.azurerm v1.24.0
我创建了一个包含main.tf文件的文件夹,配置如下:

provider "azurerm" {
    version = "=1.24.0"
    subscription_id = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
    client_id = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
    client_secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX="
    tenant_id = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}

resource "azurerm_resource_group" "rg" {
    name = "testResourceGroup"
    location = "westus"
}
我支持一个代理,所以我第一次执行了此操作,因为我连接到azure,所以我使用init来下载插件:

docker run --env HTTPS_PROXY="http://myproxyfqdn:port" --rm --mount type=bind,source='/Docker/NFS/terraform',target='/terraform' -w /terraform -it hashicorp/terraform:full init
# ls -ltra
-rw-r--r-- 1 root root  759 Apr 23 09:00 main.tf
drwxr-xr-x 3 root root 4096 Apr 23 09:09 .terraform
执行此操作后,我的主机上的文件夹刷新了创建.terraform文件夹的插件:

docker run --env HTTPS_PROXY="http://myproxyfqdn:port" --rm --mount type=bind,source='/Docker/NFS/terraform',target='/terraform' -w /terraform -it hashicorp/terraform:full init
# ls -ltra
-rw-r--r-- 1 root root  759 Apr 23 09:00 main.tf
drwxr-xr-x 3 root root 4096 Apr 23 09:09 .terraform
然后,我执行了带有-out参数的计划,该参数创建了我的计划文件供以后使用:

# docker run --env HTTPS_PROXY="http://myproxyfqdn:port" --rm --mount type=bind,source='/Docker/NFS/terraform',target='/terraform' -w /terraform -it hashicorp/terraform:full plan -out testplan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.


------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  + azurerm_resource_group.rg
      id:               <computed>
      location:         "westus"
      name:             "testResourceGroup"
      tags.%:           <computed>

Plan: 1 to add, 0 to change, 0 to destroy.
------------------------------------------------------------------------
然后应用terraform.tfstate创建的计划:

# docker run --env HTTPS_PROXY="http://myproxyfqdn:port" --rm --mount type=bind,source='/Docker/NFS/terraform',target='/terraform' -w /terraform -it hashicorp/terraform:full apply testplan
azurerm_resource_group.rg: Creating...
  location: "" => "westus"
  name:     "" => "testResourceGroup"
  tags.%:   "" => "<computed>"
azurerm_resource_group.rg: Creation complete after 2s (ID: /subscriptions/8d43a801-58b6-4dde-84cc-...c60e6/resourceGroups/testResourceGroup)

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

我没有遇到问题,每次执行都会更新主机文件夹上的数据。

Hmm。。。听起来像是Docker的问题,Terraform不应该删除状态文件(我假设您是在本地存储状态,而不是使用远程状态?)。其他文件(新的、修改的等)是否在容器的生命周期内幸存,或者这是Terraform状态文件所独有的?70%的时候,这听起来很奇怪。环境中是否有任何其他变化可能会影响这一点?是的,状态都存储在本地的
mount
目录中,我可以看到它们在主机上弹出,一旦容器完成,在大多数情况下,这些文件都会被删除。主机上没有发生任何会删除这些文件的事情。您可以检查卷中是否有足够的空间来存储这些文件。@charlessu有。在主机上,我可以轻松地在该目录中创建GBs的数据。文件被创建,在容器运行后被删除。你能添加关于你用来启动docker的命令的信息吗?也许你的docker文件也是这样?最后,你能提供docker和terraform的版本吗。。。听起来像是Docker的问题,Terraform不应该删除状态文件(我假设您是在本地存储状态,而不是使用远程状态?)。其他文件(新的、修改的等)是否在容器的生命周期内幸存,或者这是Terraform状态文件所独有的?70%的时候,这听起来很奇怪。环境中是否有任何其他变化可能会影响这一点?是的,状态都存储在本地的
mount
目录中,我可以看到它们在主机上弹出,一旦容器完成,在大多数情况下,这些文件都会被删除。主机上没有发生任何会删除这些文件的事情。您可以检查卷中是否有足够的空间来存储这些文件。@charlessu有。在主机上,我可以轻松地在该目录中创建GBs的数据。文件被创建,在容器运行后被删除。你能添加关于你用来启动docker的命令的信息吗?也许你的docker文件也是这样?最后,你能提供docker和terraform的版本吗?我想知道它是否与Ubuntu上的docker相关。我重新启动了操作系统,启动了两个ZSH终端,一个用来检查目录的内容,另一个用来运行docker容器。有时计划文件在容器中存活,有时则不然。可能是docker和terraform之间的竞争条件。。。从这样的脚本在容器内执行terraform似乎“修复”了它:
cd../demo;地形平面图-输出状态;地形状态;sleep 1
这篇文章中的答案解决了你的问题吗?你找到了问题的根本原因了吗?我想知道这是否与Ubuntu上的docker有关。我重新启动了操作系统,启动了两个ZSH终端,一个用来检查目录的内容,另一个用来运行docker容器。有时计划文件在容器中存活,有时则不然。可能是docker和terraform之间的竞争条件。。。从这样的脚本在容器内执行terraform似乎“修复”了它:
cd../demo;地形平面图-输出状态;地形状态;sleep 1
这篇文章中的答案解决了你的问题吗?你找到了问题的根本原因了吗?