【问题标题】:With Docker, how can I bind mount but also preserve container files?使用 Docker,我如何绑定挂载并保留容器文件?
【发布时间】:2020-04-27 08:21:41
【问题描述】:

我想使用 Docker 容器来运行使用本地文件的实用程序(特别是 Terraform)。为了快速迭代代码(比如my_stuff.tf)我想绑定挂载我的工作目录。但是,我想考虑一些相对稳定和静态的东西,例如插件。基本上我希望通过三种方式来处理事情:

  1. .terraform/ 是稳定的东西,应该存在于容器中,但不存在于我的主机目录中,但即使在挂载后也需要保留。
  2. my_stuff.tf 存在于容器中(因为init 需要它)和主机目录中(因为我想编辑它)。我希望我的主机目录版本覆盖容器版本。
  3. 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 中所述,是否有一种巧妙的方法可以使绑定挂载的行为与命名卷在首次初始化时的行为方式相同?目前,似乎我可能需要编写一个小入口点脚本,将稳定的东西符号链接到我的工作目录中。

【问题讨论】:

    标签: docker


    【解决方案1】:

    我曾经使用在我的计算机上运行的旧开发 Weblogic 容器来执行此操作:

    1. 运行镜像
    2. docker cp本地磁盘感兴趣的目录
    3. Stop 和 kill 容器
    4. 使用卷映射再次运行映像。

    这让我能够从原始容器中的文件重新开始,并保留服务器中的所有更改。

    【讨论】:

    • 那么,将这种模式应用到我的场景中,我会在构建映像后将.terraform/ 目录复制到我的主机,以便它存在于绑定挂载中?
    • 是的,这就是我最终解决的方法。运行一次以复制目录。删除它。使用体积映射再次运行,瞧。
    • 好的,在你的回答和stackoverflow.com/a/31316636/447862 之间,我可以完全自动化这个过程! 1. 构建 2. 创建 3. cp 4. rm 5. 运行
    猜你喜欢
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 2019-01-09
    • 2020-05-24
    • 1970-01-01
    相关资源
    最近更新 更多