Содержание изображения Docker недоступно в POD (Docker / Kubernetes) - PullRequest
0 голосов
/ 03 мая 2019

Я создаю php-образ, содержащий установщик magento. Содержимое хранится в / var / www / html изображения. Теперь у меня есть Php-образ и несколько файлов развертывания. Но содержимое папки images / var / www / html не отображается ни в одном созданном POD. Сначала я подумал, что мне нужно создать том в образе PHP, сопоставляя его с путем / var / www / html. Но это не помогло (но мне это кажется логичным).

Может, есть проблема с постоянным требованием к объему? Я прочитал, что мне нужно создать том в контейнере php и nginx с тем же путем / var / www / html, чтобы содержимое php могло выполняться nginx, поэтому я так и сделал. Но теперь я не уверен, действительно ли это так, и это мешает ПВХ.

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 (использование образа сборки с веб-приложением)

    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

EDIT: Я понял, когда я использую subPath в php-deploy.yaml так:

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

Мой контент доступен в PHP Pod. Но я не могу добавить ту же логику к развертыванию nginx, потому что она перезаписывает содержимое и папка снова пуста.

Теперь, шаг вперед, но все же вопрос, как это сделать правильно. Должен ли я использовать mountPath между nginx и php?

1 Ответ

0 голосов
/ 04 мая 2019

(1) У вас есть живые данные, запеченные в вашем изображении, но вы переопределяете их, монтируя том по тому же пути.Если данные не должны изменяться во время выполнения, не монтируйте том.Если это так, используйте другой путь и скопируйте текущие данные при инициализации вашего Pod.

(2) У вас есть один PVC с ReadWriteOnce, но ваше PHP-развертывание имеет вид Deployment, который может бытьмасштабируется (вы инициализируете его с 1 репликой).Как только вы попытаетесь увеличить его, все его модули, кроме первого, потерпят неудачу, потому что они не смогут получить доступ к той же заявке с правами на запись.

(3) У вас есть второе развертывание ипопробуйте повторно использовать тот же ReadWriteOnce том.Возникнет та же проблема, что и (2).

Обходите все это, создавая ваши стручки с их собственными индивидуальными PVC (вы можете создать их из volumeClaimTemplates) автоматически, которые принадлежат только одному стручку.Правильно инициализируйте каждый Pod, установив его данные контейнера «вживую»;скопируйте его на монтирование, где его можно изменить во время выполнения.Если вам нужна согласованность файлов между модулями в разных развертываниях, раскрутите NFS-сервер в кластере, чтобы обеспечить ReadWriteMany тома.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...