【问题标题】:Docker Image content not available in POD (Docker/Kubernetes)Docker Image 内容在 POD (Docker/Kubernetes) 中不可用
【发布时间】:2019-09-22 01:54:18
【问题描述】:

我正在构建一个包含 composer magento 安装的 php 映像。内容存储在图像的 /var/www/html 中。现在我有一个 PHP-Image 和一些部署文件。但是图像 /var/www/html 文件夹的内容不会显示在任何创建的 POD 中。首先我在想,我必须在 PHP 图像中创建一个卷,映射到 /var/www/html 路径。但这并没有帮助(但对我来说这似乎是合乎逻辑的)。

也许永久卷声明存在问题?我读到,我必须在 php 和 nginx 容器中创建一个具有相同 /var/www/html 路径的卷,以便 php 内容可以由 nginx 执行,所以我这样做了。但现在我不确定这是否真的是这样做的方法,它会干扰 PVC。

PHP Docker-Image

# image
FROM php:7.1-fpm

# envs
ENV INSTALL_DIR /var/www/html

# install composer
RUN curl -sS https://getcomposer.org/installer | php \
&& mv composer.phar /usr/local/bin/composer

# install libraries
... shortended ...

# set memory limits
RUN echo "memory_limit=2048M" > /usr/local/etc/php/conf.d/memory-limit.ini

# clean apt-get
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# www-data should own /var/www
RUN chown -R www-data:www-data /var/www

# switch user to www-data 
USER www-data

# copy sources with proper user
COPY --chown=www-data ./magento2/composer $INSTALL_DIR

# set working dir
WORKDIR $INSTALL_DIR

RUN composer install

# chmod directories
RUN chmod u+x bin/magento

# switch back
USER root

VOLUME $INSTALL_DIR

部署 1。持久卷声明

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-volume-magento
    spec:
      capacity:
        storage: 50Gi
       accessModes:
        - ReadWriteOnce

2。 PHP 部署(将构建映像与 Web 应用程序一起使用)

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: php
      labels:
        app: php
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: php
      template:
        metadata:
          labels:
            app: php
            tier: frontend
        spec:
          containers:
            - name: php-mage
              image: php-mage:latest 
              imagePullPolicy: Never
          volumeMounts:
            - name: magento2-persistent-storage
              readOnly: false
              mountPath: /var/www/html
           volumes:
             - name: magento2-persistent-storage
               persistentVolumeClaim:
               claimName: magento2-volumeclaim

3. Nginx 部署

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
          app: nginx
          tier: frontend
        spec:
          containers:
            - name: nginx
              image: nginx:latest
              ports:
                - containerPort: 80
                - containerPort: 443

              volumeMounts:
                - name: magento2-persistent-storage
                  readOnly: false
                  mountPath: /var/www/html

                - name: nginx-config-volume
                  mountPath: /etc/nginx/nginx.conf
                  subPath: nginx.conf

                - name: nginx-site-config-volume
                  mountPath: /etc/nginx/sites-enabled/default.conf
                  subPath: default.conf

                - name: fastcgi-snippet-volume
                  mountPath: /etc/nginx/snippets/fastcgi-php.conf
                  subPath: fastcgi-php.conf

    volumes:
      - name: magento2-persistent-storage
        persistentVolumeClaim:
          claimName: magento2-volumeclaim

       - name: nginx-config-volume
         configMap:
           name: nginx-config

        - name: nginx-site-config-volume
          configMap:
            name: nginx-site-config

        - name: fastcgi-snippet-volume
          configMap:
            name: nginx-fastcgi-config

编辑: 我意识到,当我在 php-deployment.yaml 中使用 subPath 时:

              volumeMounts:
                - name: magento2-persistent-storage
                  readOnly: false
                  mountPath: /var/www
                  subPath: html

我的内容在 PHP Pod 中可用。但是我无法在nginx部署中添加相同的逻辑,因为它会覆盖内容,文件夹又是空的。

现在,更进一步,但仍然是如何正确执行此操作的问题。 我必须在 nginx 和 php 之间共享一个 mountPath 吗?

【问题讨论】:

    标签: php docker nginx deployment kubernetes


    【解决方案1】:

    (1) 您确实将实时数据烘焙到映像中,但通过将卷安装到同一路径来覆盖它。如果在运行时不更改数据,请不要挂载卷。如果是,请使用其他路径并在 Pod 初始化时复制实时数据。

    (2) 你有一个带有ReadWriteOnce 的 PVC,但是你的 PHP 部署是一种可以扩展的Deployment(你用 1 个副本初始化它)。一旦您尝试扩展它,除第一个之外的所有 Pod 都会失败,因为它们将无法通过写访问访问相同的声明。

    (3) 您有第二个部署并尝试重用相同的ReadWriteOnce 卷。会出现与(2)相同的问题。

    通过使用仅属于单个 Pod 的自己的单独 PVC(您可以使用 volumeClaimTemplates 构建它们)自动生成您的 Pod,从而规避所有这些问题。通过将容器数据设置为“实时”来正确初始化每个 Pod;将其复制到可以在运行时更改的挂载上。如果您需要不同部署中 Pod 之间的文件一致性,请启动集群内 NFS 服务器以提供 ReadWriteMany 卷。

    【讨论】:

      猜你喜欢
      • 2020-10-12
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 2020-05-12
      • 2022-11-30
      • 1970-01-01
      • 2021-11-21
      • 2017-05-09
      相关资源
      最近更新 更多