我的Laravel容器内的路线未更新

时间:2019-01-29 18:20:42

标签: laravel docker docker-compose

我有这个docker-compose:

version: '3'
services:
  app:
    build:
      context: .
      dockerfile: .docker/Dockerfile
    image: laravel-docker
    ports:
      - 8080:80
    volumes:
      - ./:/var/www
    links:
      - mysql
      - redis
    environment:
      DB_HOST: mysql
      DB_DATABASE: laravel_docker
      DB_USERNAME: app
      DB_PASSWORD: password
      REDIS_HOST: redis
      SESSION_DRIVER: redis
      CACHE_DRIVER: redis
  mysql:
    image: mysql:5.7
    ports:
      - 13306:3306
    environment:
      MYSQL_DATABASE: laravel_docker
      MYSQL_USER: app
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
  redis:
    image: redis:4.0-alpine
    ports:
      - 16379:6379

和此Dockerfile:

FROM php:7.1.8-apache

COPY . /srv/app
COPY .docker/vhost.conf /etc/apache2/sites-available/000-default.conf

WORKDIR /srv/app


RUN docker-php-ext-install mbstring pdo pdo_mysql \
    && chown -R www-data:www-data /srv/app
RUN a2enmod rewrite

这是我在MySQL和Redis上运行Laravel容器的配置。一切工作正常,但是当我尝试添加(或更新)新路线时遇到了问题:直到我没有停止所有容器并使用--build标签重新启动它们,它才会出现。

是否可以在不重新启动容器的情况下添加和更新路线?

3 个答案:

答案 0 :(得分:1)

ssh到应用程序容器,并从项目目录运行以下命令:

development

答案 1 :(得分:1)

基于Dockerfile,您的应用程序位于/ srv / app,但是在yml文件中,您将/ var / www列为安装目标。将其更改为/ srv / app

说明: 构建Dockerfile会产生不可变的映像。映像中的软件已配置为可以从/ srv / app服务您的应用程序。由于COPY . /srv/app将您的应用程序添加到了正确位置的图像,因此可以从那里很好地进行服务,但是该命令会在构建图像时将其添加到应用程序中,然后成为图像的不可变部分,因此您在主机上所做的更改在内部将不可见。您要做的是将项目目录的安装绑定到/ srv / app,这将使该目录的内容与主机上的目录混淆(临时“替换”),这就是yml行的作用。 (顺便说一句事实是,安装使现有目录不是特定于docker的。)

https://docs.docker.com/storage/bind-mounts/#mounting-into-a-non-empty-directory-on-the-container

之所以经常同时进行COPY和绑定安装项目目录,是因为这种做法使我们可以将相同的Dockerfile用于开发(无需频繁映像重建)和生产。

答案 2 :(得分:0)

我很想知道您的更改是否正确地传播到您的音量中。这可能是容器内部的权限问题。如果连接到容器并“ cat”路由文件的内容,会发生什么?它与容器外部的文件匹配吗?您在什么操作系统上运行docker?操作系统的文件系统如何锁定?是否有任何限制会使卷工作时髦?另外,您正在使用什么文件系统同步过程?您只是使用默认值吗?