【发布时间】:2017-06-16 14:50:20
【问题描述】:
首先,我知道不能以 root 身份正常运行。我有一个异常情况:我需要使用带有--tab参数的mysqldump,这需要写入磁盘的权限,并且我想在Docker容器之外使用这些文件。我可以解释为什么以 root 身份运行 mysqld 会使这更容易,但是这个问题还不够长吗?在这种情况下,以 root 身份运行是安全的,因为该容器将仅用于运行测试和基于 SQL 迁移脚本更新数据库备份脚本,并且它将开始执行 1 项工作,然后再次关闭。
当我在谷歌上搜索如何以 root 身份运行 mysqld 时,我在instructions on how to NOT run as root 中找到了间接给出的答案。除其他外,以用户名运行 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。 directions for the 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 映像的 entrypoint script 中的 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
上面的 sn-p 基本上说,如果用户是 root,则以 mysql 用户身份运行提供的参数(在本例中为 CMD + args)。
MySql Docker 官方镜像不支持以 root 身份运行 mysqld 吗?
【问题讨论】: