【问题标题】:How do I run mysqld as root in the official MySql docker image?如何在官方 MySql docker 镜像中以 root 身份运行 mysqld?
【发布时间】: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.cnfdirections 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 吗?

【问题讨论】:

    标签: mysql docker


    【解决方案1】:

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

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      • 1970-01-01
      相关资源
      最近更新 更多