docker - 使用 Docker 和 Docker-Swarm 运行 Symfony 5 项目的最佳实践
问题描述
我有一个现有的 Symfony 5 项目,其中包含一个 mysql 数据库和一个 nginx 网络服务器。我想 dockerize 这个项目,但在网上我发现了不同的意见如何做到这一点。
我的计划是编写一个至少包含一个 dev 和一个 prod 阶段的多阶段 Docker 文件,并使用 docker-swarm 构建它。在我看来,在构建过程中安装完整的代码并拥有多个 composer.json 文件(每个阶段一个)很有用。在网络上,我发现不要在每次构建时都安装新的应用程序,而是将供应商和 var 文件夹复制到容器中。另一种意见是在容器的构建过程准备好之后开始安装。但我认为,当应用程序成功部署时,服务还没有准备好。
您认为这里的最佳做法是什么?
解决方案
为所有环境构建完全相同的映像
不要为 prod 和 dev 构建 2 个不同的映像。docker 的主要好处之一是,您可以为生产和开发提供完全相同的环境。
您应该使用 ENV vars 控制您的环境。例如,您可以Xdebug
为启用dev
和禁用它prod
。
Composer 可以选择安装开发包和生产包。您应该使用此功能。
如果你决定安装一些包来开发。尝试对两个环境使用相同的 Dockerfile。不要使用Dockerfile.prod
,Dockerfile.dev
它会在未来引入一些混乱。
多阶段构建
如果您的构建环境需要比运行时更多的依赖项,您可以执行官方 Docker 文档中描述的多阶段构建。
它的例子是程序的编译。在编译期间,您需要大量库,并且生成单个二进制文件。所以你的运行时不需要所有的开发库。
第一阶段可以在第二阶段构建,您只需复制二进制文件即可。
将所有包构建到 docker 映像中
您应该在构建 Docker 映像时构建您的应用程序。所有的库和包都应该复制到镜像中,你不应该在应用程序启动时安装它们。原因:
- 安装完所有内容后应用程序启动速度更快
- 某些库将来可以更改或删除。您将遇到麻烦,并且可能会花费大量时间进行调试。
实施健康检查
您应该实施健康检查。应用程序需要外部依赖项,例如密码、API KEY、一些非敏感数据。通常,我们使用环境变量注入数据。
您应该检查是否所有必需的变量都已通过,并且在您的应用程序启动之前具有良好的格式。您可以实施健康检查,也可以在入口点进行检查。
在发布之前测试您的解决方案
您应该实施测试图像的机制。例如在 CI 中:
- 在构建映像之前运行单元测试
- 构建 Docker 镜像
- 使用虚拟数据启动新的应用程序映像。如果您需要 PostgreSQL DB,您可以启动另一个容器,
- 运行集成测试。
- 仅当所有测试都通过时才发布新版本的映像。
推荐阅读
- updates - 在集群之前更新 ceph 客户端?
- c# - 将字符串转换为新格式
- javascript - 添加点击事件以映射标记信息窗口
- flutter - 如何在颤动中使用CustomPainter模糊图片中的特定位置
- android - AndroidX:'com.google.android.material:material*' 库正在调用 androidx.cardview:cardview:1.0.0 但这不会下载
- google-cloud-platform - GCP批量解压维护文件结构
- keras - 使用自定义层转换 Keras 到 Core ML 模型 - 忽略转换功能
- r - 我的剧情分三层,不让我改图例?
- xcode - UIImagePickerController 关闭崩溃
- java - 在运行时解析实现