如何在同一个 kubernetes pod 中的容器之间共享文件

时间:2021-06-15 21:19:51

标签: kubernetes

我有两个容器,一个运行 phpfpm,另一个运行 nginx。我希望运行 nginx 的容器访问具有 css 和 javascript 文件的 webroot 文件。现在,nginx 成功地将 php 请求传递给 phpfpm,但是例如在呈现网页时没有显示任何样式。

这是在 Linux 系统上运行 minikube。

kind: ConfigMap
apiVersion: v1
metadata:
  name: php-ini
  namespace: mixerapi-docker
data:
  php.ini: |
    extension=intl.so
    extension=pdo_mysql.so
    extension=sodium
    extension=zip.so
    zend_extension=opcache.so

    [php]
    session.auto_start = Off
    short_open_tag = Off
    opcache.interned_strings_buffer = 16
    opcache.max_accelerated_files = 20000
    opcache.memory_consumption = 256
    realpath_cache_size = 4096K
    realpath_cache_ttl = 600
    expose_php = off
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-conf
  namespace: mixerapi-docker
data:
  default.conf: |-
    server {
        listen 80;

        root /srv/app/webroot/;
        index index.php;

        location / {
          try_files $uri /index.php?$args;
        }

        location ~ \.php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_buffers 16 16k;
            fastcgi_buffer_size 32k;
            include fastcgi_params;
        }
    }
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-nginx-deployment
  namespace: mixerapi-docker
  labels:
    app: php-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: php-nginx
  template:
    metadata:
      labels:
        app: php-nginx
    spec:
      containers:
        - name: php
          image: mixerapidev/demo:latest
          imagePullPolicy: Always
          ports:
            - containerPort: 9000
          env:
            - name: DATABASE_URL
              valueFrom:
                secretKeyRef:
                  name: php-secret
                  key: database-url
            - name: SECURITY_SALT
              valueFrom:
                secretKeyRef:
                  name: php-secret
                  key: cakephp-salt
          volumeMounts:
            - name: php-ini
              mountPath: /usr/local/etc/php/conf.d
            - name: php-application
              mountPath: /application

        - name: nginx
          image: nginx:1.19-alpine
          ports:
            - containerPort: 80
          volumeMounts:
            - name: nginx-conf
              mountPath: /etc/nginx/conf.d
            - name: php-application
              mountPath: /application

      volumes:
        - name: php-ini
          configMap:
            name: php-ini
        - name: php-application
          persistentVolumeClaim:
            claimName: php-application-pv-claim
        - name: nginx-conf
          configMap:
            name: nginx-conf
            items:
              - key: default.conf
                path: default.conf
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: php-application-pv-claim
  namespace: mixerapi-docker
  labels:
    app: php-nginx
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: mixerapi-docker
spec:
  selector:
    app: php-nginx
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30002
---
apiVersion: v1
kind: Service
metadata:
  name: php
  namespace: mixerapi-docker
spec:
  selector:
    app: php-nginx
  ports:
    - protocol: TCP
      port: 9000
      targetPort: 9000

1 个答案:

答案 0 :(得分:0)

不确定这是否是最好的方法,但我基于此: How to share files between containers in the same kubernetes pod

kind: ConfigMap
apiVersion: v1
metadata:
  name: php-ini
  namespace: mixerapi-docker
data:
  php.ini: |
    extension=intl.so
    extension=pdo_mysql.so
    extension=sodium
    extension=zip.so
    zend_extension=opcache.so

    [php]
    session.auto_start = Off
    short_open_tag = Off
    opcache.interned_strings_buffer = 16
    opcache.max_accelerated_files = 20000
    opcache.memory_consumption = 256
    realpath_cache_size = 4096K
    realpath_cache_ttl = 600
    expose_php = off
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-conf
  namespace: mixerapi-docker
data:
  default.conf: |-
    server {
        listen 80;

        root /application/webroot/;
        index index.php;

        location / {
          try_files $uri /index.php?$args;
        }

        location ~ \.php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_buffers 16 16k;
            fastcgi_buffer_size 32k;
            include fastcgi_params;
        }
    }
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-nginx-deployment
  namespace: mixerapi-docker
  labels:
    app: php-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: php-nginx
  template:
    metadata:
      labels:
        app: php-nginx
    spec:
      containers:
        - name: php
          image: mixerapidev/demo:latest
          imagePullPolicy: Always
          ports:
            - containerPort: 9000
          env:
            - name: DATABASE_URL
              valueFrom:
                secretKeyRef:
                  name: php-secret
                  key: database-url
            - name: SECURITY_SALT
              valueFrom:
                secretKeyRef:
                  name: php-secret
                  key: cakephp-salt
          volumeMounts:
            - name: php-ini
              mountPath: /usr/local/etc/php/conf.d
            - name: application
              mountPath: /application
          lifecycle:
            postStart:
              exec:
                command:
                  - "/bin/sh"
                  - "-c"
                  - >
                    cp -r /srv/app/. /application/.

        - name: nginx
          image: nginx:1.19-alpine
          ports:
            - containerPort: 80
          volumeMounts:
            - name: nginx-conf
              mountPath: /etc/nginx/conf.d
            - name: application
              mountPath: /application

      volumes:
        - name: php-ini
          configMap:
            name: php-ini
        - name: nginx-conf
          configMap:
            name: nginx-conf
            items:
              - key: default.conf
                path: default.conf
        - name: application
          emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: mixerapi-docker
spec:
  selector:
    app: php-nginx
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30002
---
apiVersion: v1
kind: Service
metadata:
  name: php
  namespace: mixerapi-docker
spec:
  selector:
    app: php-nginx
  ports:
    - protocol: TCP
      port: 9000
      targetPort: 9000

我在 docker 入口点中运行了 composer install,因此我需要将其移动到 Dockerfile 中才能使其工作。如果 ENV 是 prod,我用这个更新了我的 Dockerfile 并从我的入口点删除了安装:

RUN if [[ "$ENV" = "prod" ]]; then \
    composer install --prefer-dist --no-interaction --no-dev; \
fi