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

问题描述 投票:2回答:1

首先,我知道不要正常运行。我有一个异常情况:我需要将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图像的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 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?

mysql docker
1个回答
0
投票

注意:这是如何以SO的root用户身份运行mysqld进程,而不是如何获取root用户。

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


查看官方的entrypoint.sh,它似乎不支持chaging默认的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
© www.soinside.com 2019 - 2024. All rights reserved.