我有一个现有的Symfony 5项目,其中包含一个mysql数据库和一个nginx and服务器。我想对接这个项目,但在网上我发现了不同的意见如何做。
我的计划是编写一个多阶段的Docker文件,至少包含一个开发阶段和一个生产阶段,并使用docker-swarm进行构建。在我看来,在构建过程中安装完整的代码并拥有多个composer.json文件(每个阶段一个)是很有用的。在网络上,我发现并不是每次构建都安装新的应用程序,而是将供应商和var文件夹复制到容器中。另一种意见是在容器的构建过程准备就绪后开始安装。但我认为,当应用程序成功部署时,服务还没有准备好。
您认为这里的最佳实践是什么?
发布于 2021-01-22 16:46:16
为所有环境构建完全相同的映像
请勿为prod和dev构建两个不同的映像。docker的主要好处之一是,您可以为生产和开发提供完全相同的环境。
您应该使用ENV vars控制您的环境。例如,您可以为dev启用Xdebug,为prod禁用它。
Composer可以选择安装开发包和生产包。您应该使用此功能。
如果您决定将一些包安装到dev。尝试在两个环境中使用相同的Dockerfile。不要使用Dockerfile.prod和Dockerfile.dev,这会在将来带来一些混乱。
多阶段构建
如果您的构建环境需要比运行时多得多的依赖项,则可以执行the official Docker documentation中描述的多阶段构建。
它的例子是程序的编译。在编译过程中,您需要大量的库,并且只生成一个二进制文件。所以你的运行时不需要所有的开发库。
第一个阶段可以在第二个阶段构建,你只需复制二进制文件就可以了。
将所有包构建到docker镜像中
您应该在构建Docker镜像时构建您的应用程序。所有的库和包都应该复制到镜像中,不应该在应用程序启动时安装它们。原因:
实施运行状况检查
你应该实现Health-Check。应用程序需要外部依赖项,如密码、API密钥、一些非敏感数据。通常,我们使用环境变量注入数据。
在启动应用程序之前,您应该检查是否传递了所有必需的变量,并具有良好的格式。您可以实现Health-Check,也可以在入口点中检查它。
在解决方案发布之前对其进行测试
你应该实现测试你的镜像的机制。例如,在配置项中:
新版本的映像。
https://stackoverflow.com/questions/65841744
复制相似问题