从主机将var/cache
和var/sessions
安装到容器会导致大量加载时间。我怎么能忽略这些目录,这样我就不必等待机器和容器上的var目录同步了?
version: "3"
volumes:
var:
vendor:
services:
php:
container_name: grozissaviems_php
build:
context: docker/php
args:
ENV: ${ENV}
APP: symfony
volumes:
- .:/var/www/html:delegated
- var:/var/www/html/var
- vendor:/var/www/html/vendor
- ./logs/symfony:/var/www/html/var/logs
nginx:
container_name: grozissaviems_nginx
build:
context: docker/nginx
args:
ENV: ${ENV}
ports:
- 5000:80
volumes:
- .:/var/www/html:delegated
- var:/var/www/html/var
- vendor:/var/www/html/vendor
- ./logs/nginx:/var/log/nginx
command: "nginx"
运行容器后,如果输入,则会出现错误,提示缓存权限不正确。
如果我启动脚本以授予var / *权限
docker exec -it grozissaviems_php bash -c 'mkdir -p var/cache var/logs var/sessions'
docker exec -it grozissaviems_php bash -c 'chmod -R 777 var/cache var/logs var/sessions'
现在由于某种原因页面已加载(布局已损坏,但没有错误),但是在
dev.log
中,我得到了:我的
docker-compose.yml
有问题吗?有什么我想念的吗? 最佳答案
首先,您正在安装var
目录。这不仅是不必要的,而且可能是在主机和容器之间正确且一致地设置权限的潜在问题。
另外,您有多个冗余安装。首先安装整个项目(.:/var/www/html:delegated
),然后再安装var
和vendor
。
无需这样做,只需专门安装所需的内容即可。
(可能还会在nginx容器中安装var
和vendor
。在Web服务器容器中都不是必需的,因此只需将它们删除。在Web服务器上,只需要public
目录)。
最后,不要让chmod
成为var
目录,而只需使该目录归运行PHP进程的同一用户(大多数时候是www-data
)拥有。
您没有显示Dockerfile
,但是由于您具有构建上下文并且没有图像名称,因此您必须使用一个。
在我的项目中,我要做的是首先创建所需的目录:
RUN set -eux; \
mkdir -p var/cache var/log var/session
然后,在构建即将结束时更改其所有权:
RUN chmod g+s /var/www/html/var
RUN chown -R www-data /var/www/html/var;
这样,在
var
下创建的任何其他目录都将继承此权限。