Docker映像内容在POD中不可用(Docker / Kubernetes)

时间:2019-05-03 13:47:31

标签: php docker nginx deployment kubernetes

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

持久性批量索赔可能有问题吗?我读到,我必须在php和nginx容器中使用相同的/ var / www / html路径创建一个卷,以便nginx可以执行php内容,所以我做到了。但是现在我不确定那是否真的是这样做的方法,并且会干扰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吗?

1 个答案:

答案 0 :(得分:0)

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

(2)您有一个带有ReadWriteOnce的PVC,但是您的PHP部署属于Deployment类型,可以进行扩展(使用1个副本进行初始化)。尝试将其扩展到第一个Pod以外的所有Pod时,它们将立即失败,因为它们将无法通过写访问权限访问同一声明。

(3)您需要进行第二次部署,并尝试重用相同的ReadWriteOnce卷。与(2)相同的问题也会发生。

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