如何在官方的 MySql Docker 镜像中以 root 用户身份运行 mysqld?

3
首先,我知道通常不应该以root身份运行。但我有一个异常情况:我需要使用带有--tab参数的mysqldump,这需要写入磁盘的权限,并且我想在Docker容器外使用这些文件。我可以解释为什么以root身份运行mysqld能使这个过程更容易,但是这个问题已经够长了吧?在这种情况下,以root身份运行是安全的,因为该容器仅用于运行测试和基于SQL迁移脚本更新数据库备份脚本,并且它将启动执行1个任务,然后再次关闭。
当我搜索如何以root身份运行mysqld时,我间接地在如何不以root身份运行的说明中找到了答案。除了其他事项之外,要以user_name用户身份运行mysqld:
引用:

以用户user_name身份启动服务器。另一种选择是以Unix root用户身份启动mysqld,并使用--user=user_name选项。

要在系统启动时自动以给定用户启动服务器,请通过向/etc/my.cnf选项文件或服务器数据目录中的my.cnf选项文件的[mysqld]组添加用户选项来指定用户名。

我们是做其中一个还是两个?我会假设是两个,以防万一。但是它们真的指的是/etc/my.cnf,还是这取决于安装(例如,Linux发行版)?例如,Docker镜像mysql:5.6/etc/mysql/my.cnfMySql Docker的说明建议在/etc/mysql/conf.d上挂载卷,该卷在上述my.cnf中被引用。(这样做会覆盖默认存在的2个配置文件,因此我在我的Dockerfile中使用了COPY命令来添加配置文件。)文件确实进入了容器:

root@4f612d10a690:/etc/mysql/conf.d# cat my.cnf
[mysqld]
user=root

MySql手册中还有一个要求是在mysqld中添加--user=root参数。官方的MySql镜像通过CMD调用mysqld,因此我在Dockerfile中对其进行了覆盖。我的CMD命令确实运行了(它在官方MySql镜像的entrypoint脚本中的两个位置运行):

# 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

请注意,我提供了--user=root命令,但mysqld正在以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)。
在官方的MySql Docker镜像中,是否支持以root身份运行mysqld?
1个回答

1
注意:这是如何将mysqld进程作为SO的root用户运行,而不是获取root MySQL用户的方法。

我不知道是否存在更好的方法,但这个方法可行。


查看官方的entrypoint.sh文件,似乎不支持更改默认的mysql用户。我发现如何以root身份运行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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接