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

时间:2017-06-16 14:50:21

标签: mysql docker

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

当我谷歌如何以root身份运行mysqld时,我在instructions on how to NOT run as root中间接找到答案。除了运行mysqld作为user_name:

之外
  

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

     

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

我们会做其中一个吗?这两个?我假设两者都是为了以防万一。但它们真的意味着/etc/my.cnf,还是取决于安装(例如Linux发行版)?例如。 Docker图像mysql:5.6具有/etc/mysql/my.cnfdirections for the MySql Docker图片建议在/etc/mysql/conf.d处安装一个卷,该卷在前面提到的my.cnf中引用。 (这样做会覆盖默认情况下存在的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图像中的2个位置运行' s entrypoint script):

# 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 image的入口点脚本在运行之前更改为mysql用户:

# allow the container to be started with `--user`
if [ ...blah... -a "$(id -u)" = '0' ]; then
    ...blah...
    exec gosu mysql "$BASH_SOURCE" "$@"
fi

上面的代码段基本上说,如果用户是root,那么运行提供的参数(在本例中为CMD + args)作为mysql用户。

官方的MySql Docker镜像是以root身份运行mysqld而不是不支持吗?

1 个答案:

答案 0 :(得分:0)

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

我不知道是否存在更好的方法,但这有效。

查看官方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