如何在官方的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