从主机到容器安装了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
中,我得到了:
缓存。警告:无法保存密钥 “%5BSymfony%5CBundle%5CWebProfilerBundle%5CController%5CProfilerController%5D%5B1%5D” (数组) {“ key”:“%5BSymfony%5CBundle%5CWebProfilerBundle%5CController%5CProfilerController%5D%5B1%5D”,“ type”:“ array”,“ exception”:“ [对象] (ErrorException(代码:0): 重命名(/var/www/html/var/cache/dev/pools/zjgXxX8mSM/5ed64142f0b543.18899510,/var/www/html/var/cache/dev/pools/zjgXxX8mSM/J/P/W1NfrOIzF1l75zOKFhaN): 找不到这样的文件或目录 /var/www/html/vendor/symfony/symfony/src/Symfony/Component/Cache/Traits/FilesystemCommonTrait.php:93)“} []
我的docker-compose.yml
出问题了吗?有什么我想念的吗?
答案 0 :(得分:1)
首先,您正在安装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
下创建的任何其他目录都将继承此权限。