首先,我知道通常不应该以root身份运行。但我有一个异常情况:我需要使用带有--tab参数的mysqldump,这需要写入磁盘的权限,并且我想在Docker容器外使用这些文件。我可以解释为什么以root身份运行mysqld能使这个过程更容易,但是这个问题已经够长了吧?在这种情况下,以root身份运行是安全的,因为该容器仅用于运行测试和基于SQL迁移脚本更新数据库备份脚本,并且它将启动执行1个任务,然后再次关闭。
当我搜索如何以root身份运行mysqld时,我间接地在如何不以root身份运行的说明中找到了答案。除了其他事项之外,要以user_name用户身份运行mysqld:
引用:
请注意,我提供了--user=root命令,但mysqld正在以mysql用户身份而不是root身份运行。
这是我的完整Dockerfile:
我唯一的猜测是,它不能以root身份运行,可能是因为mysql镜像的入口脚本在运行之前会切换到mysql用户。
上面的代码片段基本上表示,如果用户是root,则以mysql用户身份运行提供的参数(在这种情况下为CMD + args)。
在官方的MySql Docker镜像中,是否支持以root身份运行mysqld?
当我搜索如何以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.cnf
。MySql 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?