我想使用Docker容器来使用本地文件运行实用程序(特别是Terraform(。为了快速迭代代码(如my_stuff.tf
(,我想绑定挂载我的工作目录。但是,我想考虑一些相对稳定和静态的东西,例如插件。基本上,我希望有三种方式来处理事情:
.terraform/
是稳定的东西,应该存在于容器中,但不是我的主机目录,但即使在挂载后也需要保留。my_stuff.tf
存在于容器中(因为init
需要它(和主机目录(因为我想编辑它(。我希望我的主机目录版本覆盖容器版本。terraform.tfstate
可能一开始就不存在于任一位置,而是在运行过程中生成的。我希望它一旦存在就保留在我的主机目录中。
(我猜像README.md
这样的第四类,我不在乎它是否存在(
就我而言,TF 希望配置插件的.terraform/
和terraform.tfstate
(我想用我的绑定挂载捕获的输出之一(都在同一个目录中,所以我不能只使用不同的目录来存储容器内部的东西和绑定挂载的东西。
# Dockerfile
FROM plugin_source AS plugins
FROM terraform_base
COPY --from=plugins terraform-provider-X /bin/
COPY my_stuff.tf /app/
WORKDIR /app
RUN /bin/terraform init
和我的运行命令:
docker run --rm -i -t --mount source=$PWD,target=/app,type=bind my_terraform <some-tf-command>
有没有一种巧妙的方法可以使绑定挂载的行为与命名卷在首次初始化时的行为相同,如 https://docs.docker.com/storage/bind-mounts/#mount-into-a-non-empty-directory-on-the-container 中所述?目前,似乎我可能需要编写一个小的入口点脚本,将稳定的东西符号链接到我的工作目录中。
我曾经使用计算机上运行的旧开发Weblogic容器执行此操作:
- 运行映像
- 将感兴趣的目录
docker cp
到本地磁盘 Stop
和kill
容器- 使用卷映射再次运行映像。
这让我能够重新开始使用原始容器中的文件,并在服务器中保留所有更改。