【问题标题】:Use docker-compose correctly so that two containers can files in the same volume正确使用 docker-compose 以便两个容器可以在同一个卷中归档
【发布时间】:2021-12-21 06:31:50
【问题描述】:

我有一个 laravel 应用程序(基于 laradock),它经过修改以将其生产化。

github

我正在尝试构建一个解决方案,其中:

  1. 文件从主机复制到 php 应用程序到一个卷。正如您在此处的 docker 文件中所见,这些文件已复制到映像中:image file copy,并且 composer update 正在按预期运行。 composer update
  2. php app内置于docker(composer update命令需要在volume上运行)
  3. 调用docker-compose up时,多个容器启动,nginx和php-fpm共享相同的内容。 Nginx 容器因此可以服务于 php 应用程序。

当我在上面的 repo 中运行代码时,我在浏览器中看到 404。原因是(我认为)因为在 docker-compose 文件的第 97 行,声明:

    - app-data:/var/www/

(挂载卷),已删除已在挂载时添加的文件。 (这些文件作为 docker build php-fpm 的一部分被正确添加到图像中。)。

所以,问题是,我怎样才能在运行时挂载一个卷,而不是删除作为映像构建的一部分添加的文件?需要将卷添加到该路径,以便两个容器都可以看到文件 (AFAIK)。

【问题讨论】:

  • 通常的答案是将数据放在与应用程序代码不同的目录中,并仅在数据目录上安装卷。您通常不应该在应用程序代码上挂载卷或主机目录;使用 Docker 映像中内置的代码。
  • (最好还是完全不在容器之间共享文件,让一个容器通过 HTTP 接口或类似的东西向另一个容器发送数据。这在 Kubernetes 等分布式环境中效果更好,但您的应用程序可能会发生重大变化。)
  • 感谢大卫。我对第二种方法感兴趣。您可以将我链接到我如何实现这一点的任何示例?也许请添加一个答案,我会接受。谢谢

标签: php laravel docker docker-compose docker-volume


【解决方案1】:

Docker 卷将保留它的数据,除了第一次创建它会使用你的容器数据来初始化卷。我猜你之前错误地创建了卷。所以你只需要手动删除app-data卷并重新部署你的docker-compose文件。

  • 停止 docker compose
  • docker volume rm <project_name_or_stack_name>_app-data
  • 再次启动 docker compose

此外,您需要确保包含您的源代码数据的 php-fpm 将在任何其他共享应用程序数据量的服务之前首先启动。

【讨论】:

    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2019-10-29
    • 2020-03-06
    • 2021-01-26
    • 2022-01-14
    相关资源
    最近更新 更多