Docker-compose 推荐使用数据容器的方式

标签 docker docker-compose

在我的应用程序中,我有一个 nginx 容器,我想用它来提供静态 webapp 文件。这些 webapp 文件存在于名为“webapp”的单独容器中。

将 webapp 容器安装到 nginx 容器中的推荐方法是什么?我目前的方法是这样的:

version: '2'
services:
  nginx:
    volumes_from:
      - webapp


  webapp:
      image: someimageurl                                  

在 webapp 的 Dockerfile 中,我在 nginx 容器所服务的同一路径上公开了一个卷。

这很好用,但问题是在 docker-compose v3 中,“volumes_from”被删除并替换为命名卷。所以我的新配置看起来像:
version: '3'

volumes: 
   static-webapp:

services:
  nginx:
    volumes:
      - static-webapp:/opt/webapp


  webapp:
      image: someimageurl
      volumes:
        - static-webapp:/opt/webapp                          

这样做的问题是来自 webapp 容器的数据只会被复制到 'static-webapp' 卷中一次。更改内容后重新运行docker-compose up,volume中的内容不变。我知道这是设计使然,以免覆盖持久数据。

我的问题是:我应该如何使用 docker-compose 的 v3 来做到这一点?我本质上想要一个可以安装到多个容器中的未命名卷。

我想到的解决方案是:

1.) 将静态内容捆绑在 nginx 容器中。我不喜欢这样,因为那样我就无法将需求分开。

2.) 我可以在每次 docker-compose 运行后手动删除“static-webapp”卷。这似乎也不理想。

最佳答案

推荐的方法是删除容器之间的依赖项,因为这些依赖项在逻辑上不适用于 swarm,其中容器可能运行在无法共享文件的不同主机上(这就是为什么从版本 3 格式中删除了volumes-from)。在引入命名卷后,数据容器已经被弃用,尽管一些过时的文档另有建议。

我能想到的选项包括:

  • 使用版本 2 撰写文件而不使用群模式。如果您不将其与群模式一起使用,则无需升级到版本 3 格式。
  • 直接将您的数据添加到每个容器。
  • 重新构建您的应用程序以不同方式拆分组件。我不清楚 nginx 和另一个容器中应用程序代码的用例,似乎应该只有一个。
  • 创建一个包含所有应用程序数据的数据同步实用程序容器,在整个 swarm 中全局运行,并在启动时将更改推送到每个 swarm 节点上的卷。这也可以轮询诸如 git repo 之类的内容,并根据任何更改不断更新本地卷。然后您的其他容器指向这个本地命名卷。
  • 将容器指向远程卷,如 NFS,因此您只需从任何主机更新一次数据并消除任何不同步的主机,但也会增加任何读取的额外延迟。
  • 关于Docker-compose 推荐使用数据容器的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42958573/

    相关文章:

    docker - 在 Kubernetes 集群上运行自动集成测试

    docker - 在 compose 中取消设置环境变量

    python -/bin/sh:1:诗歌:找不到

    docker - 如何动态更改 docker-compose 图像字段

    docker - 使用docker-compose将Gitlab CI/CD移植到Digital Ocean以获取多个存储库

    linux - Docker 卷将文件绑定(bind)为远程 linux 服务器上的目录

    Windows 上的 Docker 不支持 COPY --from?

    python - 在基于 Alpine Linux 的 Docker 镜像中安装 pylint

    docker - 无法在容器启动时运行自定义脚本

    security - Docker 中的 Volume 是一个安全漏洞吗?