我有这个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标记重新启动它们时,它才会出现。

有没有一种方法可以添加和更新路由而无需重新启动容器?

最佳答案

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

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

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

之所以我们经常同时复制和绑定(bind)来装载我们的项目目录,是因为这种做法使我们能够将相同的Dockerfile用于开发(无需频繁的镜像重建)和生产。

关于laravel - 路径未在我的Laravel容器内更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54427331/

10-12 22:21