【问题标题】:Can't clear Laravel cache when using multiple Docker containers使用多个 Docker 容器时无法清除 Laravel 缓存
【发布时间】:2019-05-05 21:12:03
【问题描述】:

我无法刷新 Laravel 缓存,我认为问题可能与使用多个运行 Laravel 堆栈的 Docker 容器有关。我试过php artisan cache:clearphp artisan config:cache。我已经删除了bootstrap/cache/config.php,但文件只是以旧配置重新出现,就像一些不死生物困扰着我一样。

我能够刷新缓存的唯一方法是使用 docker-compose down 完全删除容器,然后再次运行容器。

在下面的 docker-compose 中,您可以看到我的应用程序、队列和调度程序容器都运行 Laravel 堆栈,代码库从主机安装。这会导致问题吗?

docker-compose.yml

version: '3'
services:

  #PHP Service
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: digitalocean.com/php
    container_name: app
    restart: unless-stopped
    tty: true
    env_file: '.env'
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
      #APP_ENV: local
    working_dir: /var/www
    volumes:
      - ./:/var/www
      - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
      - ./php/opcache.ini:/usr/local/etc/php/conf.d/opcache.ini
    networks:
      - app-network

  scheduler:
    image: digitalocean.com/php
    container_name: scheduler
    restart: unless-stopped
    depends_on:
      - app
    volumes:
      - .:/var/www
    env_file: '.env'
    environment:
      CONTAINER_ROLE: scheduler
    networks:
      - app-network

  queue:
    image: digitalocean.com/php
    container_name: queue
    restart: unless-stopped
    depends_on:
      - app
    volumes:
      - .:/var/www
      - ./supervisor/supervisord.conf:/etc/supervisor/supervisord.conf
      - ./supervisor/conf.d:/etc/supervisor/conf.d
    env_file: '.env'
    environment:
      CONTAINER_ROLE: queue
    networks:
      - app-network

  #Nginx Service
  webserver:
    image: nginx:alpine
    container_name: webserver
    restart: unless-stopped
    tty: true
    ports:
      - "${local_ip}:${host_web_port}:80"
      #- "${local_ip}:443:443"
    volumes:
      - ./:/var/www
      - ./nginx/conf.d/:/etc/nginx/conf.d/
    networks:
      - app-network

  #MySQL Service
  db:
    image: mysql:5.7.26
    container_name: db
    restart: unless-stopped
    tty: true
    ports:
      - "${local_ip}:${host_db_port}:3306"
    environment:
      MYSQL_DATABASE: dbname
      MYSQL_USER: laravel
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: root_password
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - dbdata:/var/lib/mysql/
      - ./mysql/my.cnf:/etc/mysql/my.cnf
    networks:
      - app-network

#Docker Networks
networks:
  app-network:
    driver: bridge

#Volumes
volumes:
  dbdata:
    driver: local

谁能告诉我如何在不破坏容器的情况下重新加载缓存?

为了完整起见,我使用本指南设置 Docker 环境:https://www.digitalocean.com/community/tutorials/how-to-set-up-laravel-nginx-and-mysql-with-docker-compose

我正在使用本指南运行队列和调度程序容器:https://laravel-news.com/laravel-scheduler-queue-docker。但是我已经修改了队列以运行主管。

start.sh

#!/usr/bin/env bash

set -e

role=${CONTAINER_ROLE:-app}
env=${APP_ENV:-production}

if [ "$env" != "local" ]; then
    echo "Caching configuration..."
    (php artisan config:cache && php artisan view:cache) # && php artisan route:cache - can't cache route closures
fi

if [ "$role" = "app" ]; then

    exec php-fpm

elif [ "$role" = "queue" ]; then

    echo "Running the queue..."
    /usr/bin/supervisord

elif [ "$role" = "scheduler" ]; then

    while [ true ]
    do
      php artisan schedule:run --verbose --no-interaction &
      sleep 60
    done

else
    echo "Could not match the container role \"$role\""
    exit 1
fi

【问题讨论】:

  • 您是否也尝试过php artisan optimize:clear
  • 我没有尝试过,因为我有一些使用闭包的路由,这会破坏php artisan optimize。但是为了尝试一切,我将用控制器替换闭包并稍后尝试。

标签: laravel docker


【解决方案1】:

认为我现在明白发生在我身上的事情了。我的 Laravel 配置选项由 .env 文件定义,我的 docker-compose.yml 文件也在读取该文件以设置容器环境变量。这些container environment variables cannot be changed at runtime 始终优先于在容器运行时对.env 文件所做的更改。

停止和启动容器不会改变环境变量。只有销毁容器并让它重新启动,从而重新读取.env文件设置环境变量,我的更改才会生效。

那么正确的设置应该是仅对 Laravel 使用 .env,并为容器环境变量使用单独的文件。换句话说,更改docker-compose.yml 中的env_file: '.env' 条目。

【讨论】:

  • 您好,我也是这种情况。每次在我的一项工作中更改代码时,我都需要使用条纹 webhook 和 laravel 工作docker-compose down && docker-compose up -d。我不明白问题中 docker&&Laravel 之间常用的 .env 在做什么。如果您能解释一下,我将不胜感激:)
  • 我认为“工作”是您问题中的关键词。我还发现 Laravel 作业很难与代码更改保持同步。我需要完全杀死作业容器才能使更改生效。仅将单独的容器用于作业时,这会更容易。抱歉,我无法提供更具体的知识。
猜你喜欢
  • 1970-01-01
  • 2017-09-18
  • 2019-10-14
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 2018-06-04
  • 2013-07-24
相关资源
最近更新 更多