gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:44:40 25 4
gpt4 key购买 nike

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

当我搜索如何以 root 身份运行 mysqld 时,我在 instructions on how to NOT run as root 中找到了间接给出的答案。 .为了以 user_name 身份运行 mysqld,除其他事项外:

Start the server as user user_name. Another alternative is to start mysqld as the Unix root user and use the --user=user_name option.

To start the server as the given user automatically at system startup time, specify the user name by adding a user option to the [mysqld] group of the /etc/my.cnf option file or the my.cnf option file in the server's data directory.

我们会做其中之一吗?那两个?我会假设两者以防万一。但它们真的意味着 /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 用户而非根用户身份运行的。

这是我的完整 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

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

官方 MySql Docker 镜像不支持以根用户身份运行 mysqld 吗?

最佳答案

注意:这是如何以 SO 的根用户身份运行 mysqld 进程,不是如何获取根 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>

第三步)根据已经创建的数据目录再次启动一个新的mysql进程,但是这次避免运行官方的mysql入口点:

docker run \
-v $(pwd)/mysql/:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD="abc" \
--entrypoint mysqld \
mysql:5.6 \
--user root

第四步)检查:

▶ 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

关于mysql - 如何在官方 MySql docker 镜像中以 root 身份运行 mysqld?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44592222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com