【问题标题】:Can I create a docker volume where files and folders cannot be overriden or deleted?我可以创建一个无法覆盖或删除文件和文件夹的 docker 卷吗?
【发布时间】:2019-10-24 16:05:55
【问题描述】:

是否可以在我的卷中写入文件,前提是它们尚未退出并且永远不会删除我以前的文件?

我有一个 Dockerfile,它创建了一个名为 bot 的图像。在图像中,我有一个文件夹 /models,它可以是空的。 构建镜像后,它会被推送到 Nexus/Dockerhub 存储库。

为了在我的虚拟机上构建我的应用程序,我有一个 docker-compose.yml,除其他外,它称为bot 图像,还指定文件夹/models 应该在一个卷中。

我的问题是,我的虚拟机上的/models 已经有文件(file_1file_2、...),如果我先使用docker-compose down,然后再使用docker-compose up -d,我会保留这些文件,因为我的音量。但是,如果我有一个新版本的图像bot,当我做docker-compose up -d 时,我会调用我的图像的新版本(这几乎是我想要的),但我会删除我卷中的文件夹/models我图片中的新 /models 文件夹。

因此,我想找到一种方法在我的卷中写入文件,前提是它们尚未退出并且永远不会删除我以前的文件。

version: "3.2"

services:
  bot:
    restart: always
    tty: true
    volumes:
      - type: volume
        source: ModelsVolume
        target: /models
        volume:
          nocopy: true

volumes:
  ModelsVolume:

【问题讨论】:

  • 您可以随时更新您的bot 图像的ENTRYPOINT 以使用包含检查文件是否存在的逻辑的shell 脚本,即:[ -e "/models/file_1" ] || [ -e "/models/file_2" ] || touch /models/file_1 /models/file_2
  • 你是对的,谢谢你的帮助!

标签: docker docker-compose dockerfile docker-volume


【解决方案1】:

按照@masseyb 的评论,我会在图像构建时执行任何文件检查,并在图像中写入一个小文件(甚至可能是要执行的 shell 脚本),告诉我模型文件是否可写.然后,您在 ENTRYPOINT 中调用的脚本可以使用该文件执行相应的复制逻辑。

您的 compose shell 脚本还可以通过运行容器并查找构建步骤在其中写入的文件来执行主机级别的检查。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多