【问题标题】:Docker + Symfony - cache.WARNING: Failed to save keyDocker + Symfony - cache.WARNING:无法保存密钥
【发布时间】:2020-06-02 22:08:31
【问题描述】:

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 我得到:

cache.WARNING: 保存密钥失败 "%5BSymfony%5CBundle%5CWebProfilerBundle%5CController%5CProfilerController%5D%5B1%5D" (大批) {"key":"%5BSymfony%5CBundle%5CWebProfilerBundle%5CController%5CProfilerController%5D%5B1%5D","type":"array","exception":"[object] (错误异常(代码: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 有问题吗?有什么我错过的吗?

【问题讨论】:

  • 我认为您的问题是您在docker exec 中使用的路径不正确,请尝试使用绝对路径而不是相对路径,看看会发生什么

标签: docker symfony docker-compose


【解决方案1】:

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

另外,您有多个冗余挂载。你先挂载整个项目(.:/var/www/html:delegated),然后挂载varvendor

无需这样做,只需专门安装您需要的东西。

(切线,您还在您的 nginx 容器中安装 varvendor。在 web-server 容器中这些都不是必需的,所以只需删除它们。在 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 下创建的任何其他目录都将继承此权限。

【讨论】:

  • 这是否意味着我应该只安装 var 和 vendor 而不是 - /var/www/html/var?所以容器中的更改不会与我的主机同步?
  • 没有理由将var 中的更改从容器“同步”到主机,反之亦然如果您要“同步”某些东西(仅在开发期间),那可能是var/log。但是然后您仅安装那个,没有别的。
  • 但是正如你从上面的卷中看到的- .:/var/www/html:delegated 整个项目正在同步。我的项目很慢,所以我想停止接收var 从容器到我的主机的更改。如您所见,我尝试安装它,但这给了我权限问题
  • 不要挂载整个项目。只需挂载开发过程中实际需要的目录即可。 srcconfigbinpublic,也许还有vendor。不要安装整个东西,而只是你需要的。而且你绝对不需要挂载var
  • 我是否也需要将相同的卷添加到 nginx 中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 2021-12-17
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多