【问题标题】:Set symfony cache directory in parameters在参数中设置 symfony 缓存目录
【发布时间】:2016-10-09 23:04:48
【问题描述】:

我正在为 Symfony 应用程序构建一个 docker 环境。我每个应用程序都有一个容器,其中包含一个仅用于链接到应用程序服务器的 Web 根的附加数据容器。作为基础设施安全加固的一部分,这些数据容器被设置为只读,以防止任何远程代码漏洞。然后,每个应用程序还有一个允许写入日志的侧车容器。

Symfony 当前将缓存写入默认的cache_dir 位置

${web_root}/app/cache/${env}

在只读数据容器中

尝试启动应用程序时出现此错误

无法写入缓存目录

显然它在只写容器中会发生这种情况

我已经将我的log_path设置在read-write sidecar日志容器的只读容器外的参数中

/data/logs/symfony

效果很好。

我已经阅读了 Symfony 食谱关于如何覆盖目录结构,但它只建议如何在 AppKernal.php 中执行此操作,我不想这样做,因为路径可能会根据它是否在local/uat/prod 环境。

根据我们部署到的环境,我们从构建服务器向 Symfony 提供不同的参数,因此将这个配置放在这里是有意义的。

有谁知道是否可以覆盖配置中的缓存目录而不是编辑AppKernal.php

【问题讨论】:

  • AppKernal.php 有什么问题?这是来自他们的食谱return dirname(__DIR__).'/var/'.$this->environment.'/cache'; env 已经存在,您可以用您的自定义配置路径替换 dirname(__DIR__).'/var/'
  • 我们试图保持代码与 env 无关,因为路径变化超过 $this->environment,它需要 ifs 或 switch 依赖于我们不想要的 env

标签: php symfony security docker docker-compose


【解决方案1】:

这是我正在使用的 docker-compose yml 文件的简化示例,它带有一个只读父数据容器,带有 2 个 sidecar 容器,用于缓存和日志记录,使用 :rw 访问覆盖只读文件中包含的路径父路径

docker-compose-base.yml

version: '2.0'

# maintainer james.kirkby@sonyatv.com
# @big narstie said "dont f*** up the #base"

services:

  # web server
  pitchapp-web:
    hostname: pitchapp-web
    depends_on:
      - pitchapp-dc   
      - pitchapp-log-sc
      - pitchapp-cache-sc
      - pitchapp-fpm
    volumes_from:
      - pitchapp-dc
      - pitchapp-log-sc:rw
      - pitchapp-cache-sc:rw
    links:
      - pitchapp-fpm
    build:
      args: 
        - APP_NAME=pitchapp  
        - FPM_POOL=pitchapp-fpm
        - FPM_PORT=9001
        - PROJECT=pitch
        - APP_VOL_DIR=/data/www
        - CONFIG_FOLDER=app/config
        - ENVIRONMENT=dev
        - ENV_PATH=dev   
      context: ./pitch
      dockerfile: Dockerfile
    ports:
      - "8181:80"
    extends:
      file: "shared/dev-common.yml"
      service: dev-common-env
    env_file: 
      - env/dev.env

  # web data-container
  pitchapp-dc: 
    volumes:
      - /data/tmp:/data/tmp:rw      
      - /Sites/pitch/pitchapp:/data/www/dev/pitch/pitchapp/current:ro
    hostname: pitchapp-dc
    container_name: pitchapp-dc       
    extends:
      file: "shared/data-container-common.yml"
      service: data-container-common-env
    read_only: true
    working_dir: /data/www                      

  # web cache sidecar
  pitchapp-cache-sc:
    volumes:
      - /data/cache/pitchapp:/data/www/dev/pitch/pitchapp/current/app/cache/dev:rw
    hostname: pitchapp-cache-sc
    container_name: pitchapp-cache-sc
    extends:
      file: "shared/data-container-common.yml"
      service: data-container-common-env              
    read_only: false
    working_dir: /data/cache    

  # web log sidecar
  pitchapp-log-sc: 
volumes:
  - /data/log/pitchapp:/data/log:rw   
  - /data/log/pitchapp/symfony:/data/www/dev/pitch/pitchapp/current/app/logs:rw   
    build:
      args:
        - APP_NAME=pitchapp          
        - TARGET_SERVICE=pitchapp
    hostname: pitchapp-log-sc
    container_name: pitchapp-log-sc
    extends:
      file: "shared/logging-common.yml"
      service: logging-common-env       

data-container-common.yml

version: '2.0'

services:
  data-container-common-env:
    build:
      context: ./docker-data-container
      dockerfile: Dockerfile 
    image: jkirkby91/docker-data-container   
    env_file: 
      - env/data.env           
    restart: always
    privileged: false 
    tty: false
    shm_size: 64M
    stdin_open: true

logging-common.yml

version: '2.0'

services:
  logging-common-env:
    build:
      context: ./logging
      dockerfile: Dockerfile
    image: jkirkby91/docker-data-container    
    env_file: 
      - env/logging.env           
    restart: always
    working_dir: /data/log
    privileged: false 
    tty: false
    shm_size: 64M
    stdin_open: true       
    read_only: false     

【讨论】:

    【解决方案2】:

    我正在容器外创建缓存文件并使用-v 将目录挂载到容器中

    $DIR 是当前位置

    网页文件所在的 htdocs

    docker run -d \
       -v $DIR/htdocs:/var/www/html \
       -v $DIR/cache_folder:/var/www/html/app/cache
    

    然后确保允许容器写入 cache_folder 。优点是如果您重新创建容器,您不会丢失任何数据。这也会覆盖文件夹/var/www/html/app/cache

    您可以这样做的另一种方法是在每个容器内,但每次重启时都会放松设置

    chmod -R 777 ${web_root}/app/cache/${env}
    

    【讨论】:

    • 您的意思是在另一个只读数据容器旁边的路径上安装一个数据容器吗?在哪里使用 docker 来管理volumes_from 等卷上的acl:-myapp-dc:ro chmod 会覆盖这些规则吗?
    • 我不确定你到底是什么意思,但我会用更多代码更新我的答案
    • 他想要-v $DIR/htdocs:/var/www/html:ro,这实际上很有趣,如果您有只读的父级并使用 r/w 在父级中重新安装另一个文件夹。你能测试一下吗?
    • 如果你有-v $DIR/htdocs:/var/www/html:ro和另一个挂载-v $DIR/logs:/var/www/html/app/cache:rw,我可以确认它正在工作
    • 是的,我打败了它,您只需将只读容器中已经存在的文件夹重新挂载为具有 :rw 权限的单独卷,它就可以工作。我将很快提供完整的答案和示例代码示例。谢谢你的想法!!!!
    猜你喜欢
    • 1970-01-01
    • 2020-10-09
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多