我有这个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
标签重新启动它们,它才会出现。
是否可以在不重新启动容器的情况下添加和更新路线?
答案 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?操作系统的文件系统如何锁定?是否有任何限制会使卷工作时髦?另外,您正在使用什么文件系统同步过程?您只是使用默认值吗?