我正在构建一个包含作曲家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吗?
答案 0 :(得分:0)
(1)您确实将实时数据烘焙到图像中,但是通过将卷安装到同一路径来覆盖它。如果在运行时不更改数据,请不要安装卷。如果是这样,请使用其他路径,并在初始化Pod时复制实时数据。
(2)您有一个带有ReadWriteOnce
的PVC,但是您的PHP部署属于Deployment
类型,可以进行扩展(使用1个副本进行初始化)。尝试将其扩展到第一个Pod以外的所有Pod时,它们将立即失败,因为它们将无法通过写访问权限访问同一声明。
(3)您需要进行第二次部署,并尝试重用相同的ReadWriteOnce
卷。与(2)相同的问题也会发生。
通过自动生成仅属于单个Pod的Pod(使用volumeClaimTemplates
构建它们自己的PVC)来规避所有这些问题。通过将其容器数据设置为“实时”来正确初始化每个Pod;将其复制到可以在运行时更改的安装上。如果需要在不同部署中的Pod之间的文件一致,请启动群集内NFS服务器以提供ReadWriteMany
卷。