问题描述
在使用Kubernetes时,有一个问题是关于将大型软件(如Magento2)放入initContainer中的最佳实践。他的项目中有两个容器:php-fpm和nginx。解决方案使用’testimage’作为initContainer,并将testimage的所有文件夹和文件复制到名为volume1的共享卷中。然后,将该卷挂载到nginx和php-fpm容器中。当testimage的大小超过1GB时(例如,包含完整预构建的静态数据和编译代码的Magento2项目),复制这些文件需要很长时间,这似乎是一种不好的做法。用户想知道是否应该将项目文件放入php-fpm容器(第一个容器),然后将数据复制粘贴到Kubernetes卷中,再将其挂载到nginx中。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
将静态资源放入容器镜像中是不推荐的做法,而是应该将其放在持久卷(PersistentVolume)或对象存储(如AWS S3)中,然后由CDN使用。
由于Magento是一个内容管理系统(CMS),管理员用户可能会更改资源和其他内容的部分。将这些资源直接放入容器镜像中并不实际。
方案2
如果您的主题生成了动态资源(例如CSS),那么它不应该包含在镜像中,因为镜像的关键原则是只读。对于动态资源,您可以使用Kubernetes的持久卷(PersistentVolume)资源类型。
方案3
优化testimage镜像的大小:
1. 检查testimage的基础镜像。使用像Alpine这样的基础镜像可以节省很多空间。
2. 检查您在testimage中包含的内容。您的“预构建静态数据”不应该作为镜像的一部分(正如其他人所指出的)。如果您需要这些数据来编译初始镜像,应该在编译后清除它以减小大小。
3. 在推送镜像之前,可以从容器中清除构建testimage所需的任何工具。
使用5MB的Alpine基础镜像和正确管理“预构建静态数据”,您应该可以将大小控制在1GB以下。基本的php-fpm镜像大小约为82MB,nginx镜像大小约为9MB。
请注意,以上解决方案是根据提供的问答数据和我的知识库生成的。如果有任何版本差异或风险操作,请在开始操作之前使用Markdown的引用格式进行提示。