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

首先,我知道不要以root身份正常运行。 我有一个不正常的情况:我需要使用带有–tab参数的mysqldump,它需要写入磁盘的权限,我想在Docker容器外部使用这些文件。 我可以解释为什么以root身份运行mysqld使得这个更容易,但这个问题不是足够长吗? 以root身份运行在这种情况下是安全的,因为容器将仅用于运行testing以及基于SQL迁移脚本更新数据库备份脚本,并且将开始执行1个作业,然后再次撤回。

当我谷歌如何以root身份运行mysqld时,我find了答案间接给出了如何不作为根运行的说明 。 除了别的以外,为了以user_name身份运行mysqld:

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

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

我们做一个吗? 这两个? 我会假设,以防万一。 但是,他们真的是指/etc/my.cnf ,还是依赖于安装(例如什么Linux发行版)? 例如Docker image mysql:5.6/etc/mysql/my.cnf 。 MySql Docker镜像的指导build议在前面提到的my.cnf中引用的/etc/mysql/conf.d上挂载一个卷。 (这样做会覆盖默认存在的两个configuration文件,所以我在Dockerfile中使用了一个COPY命令,而不是仅仅添加一个configuration文件。)文件确实将它放到容器中:

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

MySql手册的另一个要求是将--user=root参数添加到mysqld。 官方的MySql映像通过CMD调用mysqld,所以我在我的Dockerfile中覆盖了这个。 我的CMD命令确实运行(它在官方的MySql映像的入口点脚本中的两个地方运行):

 # 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"] 

我唯一的猜测,为什么它不是作为根运行的是他们的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镜像?

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

我不知道是否存在一个更好的方法,但是这个工作。


查看官方的entrypoint.sh,似乎它不支持chacking默认的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)根据已经创build的数据目录再次启动一个新的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