php - Kubernetes:如何在持久卷中使用 php (Laravel) 应用程序并在拉取新镜像时更新代码更改

标签 php laravel docker kubernetes

我是 Kubernetes 新手,我尝试从持久卷运行 Laravel 应用程序。我让它工作了,我现在可以从持久卷运行代码,并且我可以扩展它。

我在自己的 Pod 中运行 nginx,并共享相同的持久卷。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    tier: backend
    app: nginx
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx
      tier: backend
  template:
    metadata:
      labels:
        app: nginx
        tier: backend
    spec:
      volumes:
      - name: laravel-pv-volume
        persistentVolumeClaim:
          claimName: laravel-pv-claim
      - name: config
        configMap:
          name: nginx-config
          items:
          - key: config
            path: site.conf
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: laravel-pv-volume
          mountPath: /code
        - name: config
          mountPath: /etc/nginx/conf.d
        ports:
        - containerPort: 80
          name: http
          protocol: TCP

我的 Laravel 部署包括 initContainers,它具有将 Laravel 源代码从/var/www 复制到/code (持久卷路径)的命令

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php
  labels:
    tier: backend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: php
      tier: backend
  template:
    metadata:
      labels:
        app: php
        tier: backend
    spec:
      volumes:
      - name: laravel-pv-volume
        persistentVolumeClaim:
          claimName: laravel-pv-claim
      containers:
      - name: php
        image: registry.digitalocean.com/xxx/laravel-test:3.0
        volumeMounts:
        - name: laravel-pv-volume
          mountPath: /code
      initContainers:
      - name: install
        imagePullPolicy: Always
        image: registry.digitalocean.com/xxx/laravel-test:3.0
        command: ["/bin/sh", "-c", "cp -R /var/www/. /code && chown -R www-data:www-data /code"]
        volumeMounts:
        - name: laravel-pv-volume
          mountPath: /code

在 Laravel 图像更改和代码更新后,如何使用新代码创建新 pod,不知何故,我认为在此之后我应该为安装创建新的持久卷路径,该路径将为新 pod 运行代码,并且何时旧的 pod 将被终止,最后一个 pod 将从持久卷中删除“旧”代码。但我也不知道现在哪个 Pod 会是最后一个?

我的解决方法可能是,如果我的 Laravel 镜像更新到下一个版本,我将添加命令来清除/code 文件夹,但这不是最佳实践,并且会导致停机。

命令:["/bin/sh", "-c", "rm -rf/code/*"&& "cp -R/var/www/./code && chown -R www-data :www-data/code"]

最佳答案

我了解这些做法的来源。但你应该在 Kubernetes 上采取不同的做法。

Docker 镜像中的代码

当你更新你的 PHP 代码时,不要把它放在 PersistentVolume 上,而是构建一个新的 Docker 镜像,例如: docker build -t <myapp>:<new version> .当您将镜像推送到注册表后,您可以更新 image: Deployment 中的字段。避免将代码放在持久卷上,并且很可能您不需要在 Deployment 中声明持久卷。完全没有。

您很可能想要 COPY命令 Dockerfile将您的代码放入容器中,例如(不知道您的路径):

COPY code/ opt/app/myapp

关于php - Kubernetes:如何在持久卷中使用 php (Laravel) 应用程序并在拉取新镜像时更新代码更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65378012/

相关文章:

php - Zend Framework 在生产环境中优雅地处理异常

php - 一般错误 : 1 no such table: users in Laravel Unit Test

linux - k8s liveness probe 失败时发送给容器中运行的进程的信号是什么?杀死或学期

docker - 如何防止每次部署到 bitbucket 时 docker 都编译库?是否有 Bitbucket 管道缓存?

python - 如何让 Python 进程使用所有 Docker 容器内存而不被杀死?

php - API 和包之间有什么区别?

php - WooCommerce 成功订单 Hook

php - 如何通过 react js在php中发布数据

javascript - AngularJS 中的 $scope 错误

php - 使用 laravel 获取具有子类别的类别