首先,我知道不能正常以root身份运行。我有一个异常情况:我需要将 mysqldump 与 --tab 参数一起使用,这需要写入磁盘的权限,并且我想在 Docker 容器之外使用这些文件。我可以解释为什么以根身份运行 mysqld 会让这更容易,但这个问题还不够长吗?在这种情况下,以 root 身份运行是安全的,因为容器将仅用于运行测试和基于 SQL 迁移脚本更新数据库备份脚本,并且它将启动以执行 1 个作业,然后再次恢复。
当我谷歌搜索如何以根身份运行 mysqld 时,我在有关如何不以根运行的说明中找到了间接给出的答案。除此之外,为了user_name运行 mysqld:
以用户user_name身份启动服务器。另一种选择是以 Unix 根用户身份启动 mysqld,并使用 --user=user_name 选项。
要在系统启动时以给定用户身份自动启动服务器,请通过将用户选项添加到服务器数据目录中的/etc/my.cnf 选项文件的 [mysqld] 组或 my.cnf 选项文件来指定用户名。
我们做其中之一吗?这两个?我会假设两者都以防万一。但它们真的意味着/etc/my.cnf
,还是取决于安装(例如什么 Linux 发行版)?例如,Docker镜像mysql:5.6
有/etc/mysql/my.cnf
。MySql Docker 映像的说明建议在前面提到的 my.cnf 中引用的/etc/mysql/conf.d
处挂载卷。(这样做会覆盖默认存在的 2 个配置文件,因此我在 Dockerfile 中使用了 COPY 命令来仅添加配置文件。该文件确实进入了容器:
root@4f612d10a690:/etc/mysql/conf.d# cat my.cnf
[mysqld]
user=root
MySql 手册的另一个要求是将--user=root
参数添加到 mysqld。官方的 MySql 镜像通过其 CMD 调用 mysqld,所以我在我的 Dockerfile 中覆盖了它。我的 CMD 命令确实运行(它在官方 MySql 映像的入口点脚本中的 2 个位置运行):
# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
mysql 1 0.1 2.8 1452788 472756 ? Ssl 14:24 0:01 mysqld --user=root
请注意,mysqld 具有我提供的 --user=root 命令,但以 mysql 用户身份运行,而不是以 root 身份运行。
这是我的完整 Dockerfile:
FROM mysql:5.6
VOLUME ["/var/lib/mysql-files"]
COPY ["my.cnf", "/etc/mysql/conf.d"]
CMD ["mysqld", "--user=root"]
关于为什么它不以 root 身份运行,我唯一的猜测是他们在运行之前将 mysql 图像的入口点脚本更改为 mysql 用户:
# allow the container to be started with `--user`
if [ ...blah... -a "$(id -u)" = '0' ]; then
...blah...
exec gosu mysql "$BASH_SOURCE" "$@"
fi
上面的代码片段基本上是说,如果用户是root,那么以mysql用户的身份运行提供的参数(在这种情况下为CMD + args)。
以根身份运行 mysqld 是否根本不受官方 MySql Docker 镜像的支持?
注意:这是如何以SO的根用户身份运行mysqld进程,而不是如何获取根MySQL用户。
我不知道是否存在更好的方法,但这有效。
查看官方 entrypoint.sh,似乎不支持默认mysql
用户 我意识到如何以根身份运行 mysql,但您需要已经初始化了数据目录。
步骤1)启动一个普通的 mysql 以初始化卷(mysql entrypoint.sh 将完成这项工作):
docker run
--rm
-v $(pwd)/mysql/:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD="abc"
mysql:5.6
步骤2)停止并移除该容器:
docker stop <container-id>
步骤3)根据已创建的数据目录再次启动一个新的 mysql 进程,但这次避免运行官方的 mysql 入口点:
docker run
-v $(pwd)/mysql/:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD="abc"
--entrypoint mysqld
mysql:5.6
--user root
步骤4)检查一下:
▶ docker exec -it 4add4d065c3e bash
root@4add4d065c3e:/# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 2.8 23.0 1314864 471104 ? Ssl 15:12 0:00 mysqld --user root
root 28 3.0 0.1 20248 3040 ? Ss 15:12 0:00 bash
root 34 0.0 0.1 17500 2068 ? R+ 15:12 0:00 ps aux