gpt4 book ai didi

docker - 指定共享卷的数据来源

转载 作者:行者123 更新时间:2023-12-02 18:05:40 26 4
gpt4 key购买 nike

我有一个我已经解决的任务,但我对解决方案不满意。基本上,我有一个网络服务器容器(Nginx)和一个快速 CGI 容器(PHP-FPM)。 webserver 容器建立在现成的镜像上,FCGI 容器基于自定义镜像并包含应用程序文件。现在,由于并非所有内容都是源代码并在 FCGI 容器上进行处理,因此我还需要使应用程序文件在 webserver 容器中可用。

这是docker-compose.yml这样做的工作:

version: '3.3'

services:
nginx:
image: nginx:1-alpine
volumes:
- # customize just the Nginx configuration file
type: bind
source: ./nginx.conf
target: /etc/nginx/nginx.conf
- # mount application files from PHP-FPM container
type: volume
source: www-data
target: /var/www/my-service
read_only: true
volume:
nocopy: true
ports:
- "80:80"
depends_on:
- php-fpm

php-fpm:
image: my-service:latest
command: ["/usr/sbin/php-fpm7.3", "--nodaemonize", "--force-stderr"]
volumes:
- # create volume from application files
# This one populates the content of the volume.
type: volume
source: www-data
target: /var/www/my-service

volumes:
# volume with application files shared between nginx and php-fpm
www-data:

我在这里不喜欢的主要体现在有关卷的评论上。谁创建和存储数据应该从代码而不是注释中显而易见。此外,我真正不喜欢的是 docker 实际上创建了一个地方来存储该卷的数据。这不仅会占用磁盘空间并增加启动时间,还需要我永远不要忘记使用 docker-compose down --volumes以便下次启动时刷新内容。想象一下当我发现 down 时我的愤怒没拆什么 up创建并且我正在从以前的运行中寻找鬼魂。

我的问题:
  • 我可以在代码中更清楚地表达一个容器包含应该提供给其他容器的数据吗?上面的代码有效,但完全无法表达意图。
  • 我可以避免创建任何持久的东西来避免上述缺点吗?
  • 我本来想调查诸如 tmpfs 卷或其他卷选项之类的东西。我的问题是我找不到可用卷驱动程序的文档,甚至无法探索存在哪些卷驱动程序。也许我为此错过了一些 CLI,我真的很感激这里正确方向的插入。
  • 最佳答案

    您可以使用 local带选项的驱动程序 type=tmpfs , 例如:

    volumes:
    www-data:
    driver: local
    driver_opts:
    type: tmpfs
    device: tmpfs

    这将遵循您的要求:
  • 数据将在运行时在容器之间共享
  • 数据不应被持久化,即当容器停止、重新启动或销毁时,卷将被清空

  • 这相当于 CLI
    docker volume create --driver local --opt type=tmpfs --opt device=tmpfs www-data

    重要提示:这不是 Docker tmpfs安装,但是一个 docker volume使用 tmpfs选项 .如 local volume driver documentation 中所述它使用 Linux mount 选项,在我们的例子中 --types指定一个 tmpfs文件系统。与简单的相反 tmpfs挂载,它将允许您在容器之间共享卷,同时保留临时文件系统的经典行为

    I can't find documentation for available volume drivers or even explore which volume drivers exist


  • Volume doc ,包括 tmpfs , Bind mountVolumes
  • local driver optionsdocker volume create 中找到文档
  • Volume driver plugins - 有些仍在定期更新或似乎在维护,但其中大部分已经很长时间没有更新或已弃用。该列表似乎并不详尽,例如 vieux/sshfs 没有提到。

  • Can I express in code that one container contains data that should be made available to other containers more clearly? The above code works, but it fails utterly to express the intent.



    我不这么认为,您的代码已经很清楚本卷的意图:
  • 这就是卷的用途:在容器之间共享数据。正如文档中所述,卷可以在多个容器之间更安全地共享,而且只有容器应该写入卷。
  • nocopyread_only明确表示nginx依赖于另一个容器写入的数据,因为它只能从这个卷中读取
  • 鉴于您的音量不是 external ,可以安全地假设只有来自同一堆栈的另一个容器可以使用它
  • 使用 Docker 的一些逻辑和经验可以让您快速回到上一点,但即使对于经验不足的 Docker 用户,您的评论也给出了明确的指示,您的评论是代码的一部分 ;)
  • 关于docker - 指定共享卷的数据来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61540383/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com