用Docker进行Laravel开发时,如何运行 artisan 才正确

用Docker进行Laravel开发时,如何运行 artisan 才正确

Docker提供了很好的开发隔离环境,使在本地开发的时候能很快的构建开发环境。当使用Docker Compose的时候就更方便了。比如Laravel开发时你可能要用的Nginx、PHP的不同版本、MySQL、Redis、Elasticsearch等等。借助于phpdocker.io/generator的帮助,你可以很方便的生成一个Docker Compose配置文件。然后用这个配置文件,运行docker-compose,一个全新的开发环境马上就就绪了。(其实还是挺慢的!因为国内人的网络慢:( )

这里有一点教训折腾了半天,分享出来希望对大家有帮助。
就是当Laravel运行在docker的容器里面的时候,Laravel是通过docker容器的网络去访问别的服务的,比如MySQL。MySQL在Docker Compose里的配置很可能主机名是database,监听的端口是3306。然后你又通过Docker把MySQL容器的3306端口暴露到本地网络上,比如是13306。这样,你就能用MySQL工具通过127.0.0.1:13306来访问这个MySQL。
但是因为Laravel配置文件是运行在docker容器里面的,所以应该是通过database:3306来连接。对应的Laravel的.env配置文件大概是这样:

DB_CONNECTION=mysql
DB_HOST=database
DB_PORT=3306
DB_DATABASE=laravel_database
DB_USERNAME=laravel_user
DB_PASSWORD=your_password

这也没有问题!只有当你在本地机器上运行artisan的时候才会出问题!
什么问题呢?就是artisan读.env文件里的数据库配置,而这个配置是配给docker容器内的Laravel来使用的。所以artisan的命令要连接数据库的时候,很可能会失败。

那怎么解决呢?两个办法。

一个办法是Laravel的。给artisan通过--env参数另外指定一个.env配置文件,在这个文件里使用暴露在本地主机上的主机和端口号。
这样似乎每次运行artisan时要小心注意,不要忘记使用--env参数。

另一个办法是docker的。就是在运行artisan之前,先进到docker容器里面去,再执行artisan。这样artisan就跟Laravel使用一样的环境了。

进入到docker容器内执行命令的语句是:

docker exec -ti <容器名称> bash

不同的docker容器shell的名字可能会不同,这里写的是bash,但也有可能是sh、ash、zsh等等。

leon

每天进步一点点
Close Menu