【发布时间】:2021-06-15 13:57:46
【问题描述】:
我正在开发一个生产 docker compose 来运行我的 Laravel 应用程序。它有以下容器(其中包括):
- php-fpm 用于应用程序
- nginx
- mysql
- redis
- 队列工作者(我的 php-fpm 的副本,加上 supervisord)。
- 部署(我的 php-fpm 的另一个副本,其中安装了 Gitlab 运行器,以及 node+npm、composer 等)
当我推送到我的生产分支时,deployment 容器内的 gitlab 运行程序会执行我的部署脚本,该脚本会构建所有内容,运行 composer update 等
最后,我的部署脚本需要重新启动队列工作程序,它们位于 queue workers 容器内。当所有东西都安装在 VPS 上时,这很容易:php artisan queue:restart。
但是如何让 deployment 容器在 queue workers 容器中运行该命令?
可能的解决方案
我的研究基本上表明容器不应该相互通信,但如果必须的话,我找到了四种可能的解决方案:
- 在两个容器中安装 SSH
- 与deployment容器共享
docker.sock,以便它可以通过docker控制其他容器 - 让 queue workers 容器监控文件系统中的目录;当它发生变化时,重新启动队列工作器
- 使用 queue workers 容器中的微型 http 服务器在容器之间进行通信
出于复杂性和安全性原因,我真的想避免使用 1 和 2。
我倾向于 3,但担心监控 fs 会浪费资源。有没有一种真正轻量级的方法来查看包含与 Laravel 安装一样多的文件的目录?
4 看起来有点疯狂,但肯定是可行的。是否有任何非常小的、简单的 http 服务器可以安装到 queue workers 容器中,当 deployment 容器到达端点时可以触发单个命令?
我希望有其他建议,或者如果确实没有比上述 3 或 4 更好的方法,请提供有关如何实施这些选项的任何建议。
【问题讨论】:
-
为什么需要重启容器内的队列而不是
docker restart <<container>>? -
那是因为在我的设置中,我已经将 gitlab 运行器 inside 安装在一个容器中,因此它无法访问控制 docker。 runner 不会重建 docker 镜像,并且不涉及私有注册表;它只是克隆 git 并在容器内运行
composer install等。
标签: laravel docker docker-compose devops