目前网上添加msyql用户和权限时,很多都是使用INSERT, UPDATE, DELETE 直接操作权限表,并且总结得参差不齐。根据官方网站应该使用 CREATE USER 语句创建用户,使用 GRANT 语句添加权限。
- 在mysql:5.7.22中需要配合 /docker-entrypoint-initdb.d/ 目录初始化数据,这时可以在该目录的sql中可以添加权限的配置。
1 | -- 不应该在这里直接删除'root'@'%',否则会影响原本root应有的权限。可以通过该命令查看该命令的影响,SHOW GRANTS FOR 'root'@'%'; |
- 当然建库建表前应该用if判断,不判断也行,因为本来就是新实例。
1 | DROP DATABASE IF EXISTS YOUR_DATABASE; |
- 查看权限
1 | SHOW GRANTS FOR 'root'@'%'; |
docker-compose up命令
运行docker-compose up时,如果以前未创建相应的镜像,则默认会创建镜像并且根据该镜像启动container;如果以前创建过镜像,则判断当前是否有对应的container,如果有则直接启动,如果没有则创建对应的container;
–build Build images before starting containers.
- –build,加了这个选项后,每次运行 docker-compose up 都会构建镜像。构建镜像有另外一个专门的命令docker-compose build,可以使用–build-arg key=val 传入编译时参数,如下则为 –build-arg X=3 –build-arg Y=4。传入到docker-compose后,再传到dockerfile的 ARG 声明的同名变量中,
1 | # docker-compose.yml |
- –force-recreate Recreate containers even if their configuration and image haven’t changed.
- –force-recreate,加了这个选项后,docker-compose会重新创建container,即使与它对应的镜像没有变化
- -V, –renew-anon-volumes Recreate anonymous volumes instead of retrievingdata from the previous containers.
- 1.22.0版本有这个选项,某些低版本的不存在该选项
- 仅在启动的容器已经被创建的情况下有意义
- 从字面上来看,使用该选项运行docker-compose up 启动容器时,将会不使用复用上一个container的volume,而是重新创建对应的volume。如果不使用该选项,而是只加了–force-recreate也将仅仅会重新创建对应的容器,而不会重新mount根据对应目录而创建的volume。这个可以通过docker inpsect containter_name命令验证,两次运行docker-compose –build –force-recreate所创建的容器对应的volume的name依然相同。
- 这个选项的存在的意义是,如果加了改选项,第一次启动容器的时候,mount对应的目录的文件有误,想stop掉当前的container,并且在对应的目录添加了对应的文件后,第二次启动容器时能够重新mount对应的文件夹,使容器读取正确对应的文件;如果不加改选项,则使用上一个container的volume,不能读取正确的文件
- 当然,也可以不使用该命令,只要不是重启container的场景即可,什么意思呢,可以先 docker-compose rm -v contaner_name,下次docker-compose up的时候就是创建新容器了,当然也会重新挂载对应的volume。目前低版本的docker-comopose就是这么做的。
- 之前在mysql:5.7.22 版本的docker容器在使用/docker-entrypoint-initdb.d/ 目录初始化数据时,遇到类似的问题,踩了很多坑。
- 总结,docker-compose up 与 docker start 命令更相似,因为它们都会复用之前的container(如果存在),而docker run是总会创建新的container。这要点需要牢记,才能避免踩坑。
参考:
Mysql官网 https://dev.mysql.com/doc/refman/5.7/en/adding-users.html