如何使用Laravel sail更改DB用户名/密码?

r3i60tvu  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(160)

我在MacOS上使用Laravel和Sail/Docker。
我想更改我的DB用户名和密码,只是为了尝试和测试。如果我在.env配置(sail 2/password 2)中更改它们,然后关闭sail,然后关闭sail up -d(甚至完全重建容器),我会看到:

  • Laravel看到了新的凭证(sail 2),因为如果我修改它:
DB::select("select * from users");

它会这样抱怨:

SQLSTATE[HY000] [1045] Access denied for user 'sail2'@'172.20.0.7'

因此Laravel从环境变量中读取新的凭据,但用户没有访问数据库的权限。

  • Docker本身确实看到了新的环境变量,因为通过检查mysql容器,我可以看到:

因此,我能说的是,除了新用户似乎没有被分配到当前数据库之外,所有这些都正常工作。
请注意,我也试图连接续集王牌和表加,但不工作。相反,它们将使用原始凭据(sail/password)进行连接。

vc6uscn9

vc6uscn91#

不能使用MYSQL_*环境变量更改现有数据库的凭据。
Laravel Sail只是一个 Package 器,在它下面只是使用MySQL官方Docker镜像(或者MariaDB镜像,也许,但这些效果是一样的)。
关于readme on that image

环境变量

[...]当你启动mysql镜像时,你可以通过在docker run命令行上传递一个或多个环境变量来调整MySQL示例的配置。请注意,如果您使用已经包含数据库的数据目录启动容器,则以下变量都不会有任何影响:任何预先存在的数据库在容器启动时将始终保持不变
强调我的)
如果您通过在映像中挂载现有数据目录来重用该目录,则即使从头开始重建映像,也将以现有数据库结束,而环境变量将不起任何作用。
要更改凭据(或添加新凭据),您需要使用常规方法(例如,GRANT语句,通过您选择的客户端执行)。

gijlo24d

gijlo24d2#

我刚刚找到了一个部分解决方案。基本上,从Docker我可以以root身份登录到数据库服务器,然后从那里我可以手动添加任何我想要的用户。因此,从Docker >中单击mysql容器和click exec。
然后以root身份登录。然后添加新用户并授予权限。

mysql> create user 'sail2'@'%' identified by 'password2';
mysql> grant all on mytestsite.* to 'sail2'@'%';

那会有用的。我不确定这是否是解决我的问题的最好方法。
更新
在此期间,我收到了一些来自laracasts家伙更多的解释,我可以张贴其他几个解决方案。但最后,我仍然认为最好的方法仍然是从docker登录并从那里更改/更新用户设置。不管怎样,还有其他方法:
a.删除mysql容器上的Docker卷。这将迫使mysql从头开始重新创建用户,但也会删除其他所有内容。
B.编辑docker-compose.yml文件并为mysql容器指定一个新卷。

mysql:
        image: 'mysql/mysql-server:8.0'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ROOT_HOST: '%'
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 1
        volumes:
            - 'sail-mysql:/var/lib/mysql' # change sail-mysql to something else.
            - './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
        networks:
            - sail
        healthcheck:

这将是相同的事情作为选项2,但没有删除您的数据,它只是一个新的开始.但您仍然无法访问现有数据。作为这一办法的一种变通办法:只需删除卷行>这也将删除数据。

相关问题