在K8s中主容器与Sidecar容器能否共享文件夹?
可行:用emptyDir实现Pod内容器实时共享PHP文件(无需网络存储)
在AWS EKS环境下,完全可以不用EFS这类网络存储,通过K8s原生的emptyDir卷实现php-fpm和Apache容器间的实时文件同步,解决你现在用postStart复制文件无法实时同步的问题。
核心思路
emptyDir是Pod级别的本地临时存储,同一个Pod内的所有容器共享这个目录,读写性能和节点本地磁盘一致,完全符合你的需求。关键是让两个容器共用同一个emptyDir目录来存放PHP代码,而不是靠复制文件。
具体实现方案
方案1:用Init容器初始化代码(推荐)
因为你的PHP代码原本打包在php-fpm镜像里,先通过Init容器把代码复制到emptyDir,再让两个容器挂载这个目录:
- 定义一个
emptyDir类型的Volume,命名为php-code - 添加一个Init容器,使用你的php-fpm镜像,把镜像内的PHP代码目录(比如
/var/www/html)完整复制到emptyDir的挂载路径 - 让php-fpm容器和Apache容器分别把
emptyDir挂载到各自的代码目录(比如两者都挂载到/var/www/html)
这样一来,两个容器访问的是同一个本地目录,修改任何一边的文件都会实时同步到另一边。
Helm配置示例
apiVersion: apps/v1 kind: Deployment metadata: name: php-apache-deployment spec: replicas: 1 selector: matchLabels: app: php-apache template: metadata: labels: app: php-apache spec: volumes: - name: php-code emptyDir: {} # 用节点本地磁盘,无网络开销 # 先把php-fpm镜像里的代码复制到共享卷 initContainers: - name: copy-php-src image: your-php-fpm-image:latest command: ["sh", "-c", "cp -rp /var/www/html/* /shared/php/"] volumeMounts: - name: php-code mountPath: /shared/php containers: - name: php-fpm image: your-php-fpm-image:latest volumeMounts: - name: php-code mountPath: /var/www/html # php-fpm直接使用共享目录 # 这里添加php-fpm的端口、环境变量等配置 - name: apache image: your-apache-image:latest volumeMounts: - name: php-code mountPath: /var/www/html # Apache也挂载同一个目录 # 配置Apache的文档根目录指向/var/www/html,以及端口等
方案2:无需Init容器,直接在php-fpm容器初始化代码
如果你的php-fpm镜像预留了代码备份目录(比如把原始代码放在/var/www/html-backup),可以直接在php-fpm容器启动时检查共享目录是否为空,为空就复制备份代码:
containers: - name: php-fpm image: your-php-fpm-image:latest command: ["sh", "-c", " if [ -z \"$(ls -A /var/www/html)\" ]; then cp -rp /var/www/html-backup/* /var/www/html; fi; php-fpm -F "] volumeMounts: - name: php-code mountPath: /var/www/html
这种方式省去了Init容器,适合镜像已经提前做好代码备份的场景。
注意事项
emptyDir的生命周期和Pod绑定,Pod被删除后目录里的内容会丢失,所以不要用它存需要持久化的数据。如果需要长期保存代码,还是建议把代码打包到镜像里,更新镜像重新部署,这也是K8s的最佳实践。- 确保Apache和php-fpm容器的运行用户对共享目录有相同的读写权限,比如都用
www-data用户,避免出现权限不足的问题。 - 如果你的节点用的是AWS EC2实例,
emptyDir默认用节点的根磁盘,也可以指定medium: Memory用内存做存储(适合小体积代码,读写更快,但重启Pod数据会丢失)。
内容的提问来源于stack exchange,提问作者prosto.vint
相关产品推荐
相关产品推荐

