Docker + Symfony-缓存。警告:无法保存密钥

时间:2020-06-02 12:39:54

标签: docker symfony docker-compose

从主机到容器安装了var/cachevar/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出问题了吗?有什么我想念的吗?

1 个答案:

答案 0 :(得分:1)

首先,您正在安装var目录。这不仅是不必要的,而且可能是在主机和容器之间正确且一致地设置权限的潜在问题。

此外,您有多个冗余安装。首先安装整个项目(.:/var/www/html:delegated,然后再安装varvendor

只需要安装所需的内容,而不是这样做。

(也有可能在nginx容器中安装varvendor。在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下创建的任何其他目录都将继承此权限。