从主机将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中,我得到了:



我的docker-compose.yml有问题吗?有什么我想念的吗?

最佳答案

首先,您正在安装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下创建的任何其他目录都将继承此权限。

10-08 03:13