我有这个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/