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

问题描述:

首先,我知道不要以root身份正常运行。我有一个异常情况:我需要与--tab说法,这就需要允许写入到磁盘使用mysqldump,我想用多克尔容器外的那些文件。我可以解释为什么以根用户身份运行mysqld使这更容易,但是这个问题不是足够长吗?以root运行是在这种情况下,安全的,因为容器将仅适用于运行测试和更新基于SQL迁移脚本DB备份​​脚本中使用,它会开始做1个职位空缺,然后取回来了。如何在官方的MySql docker镜像中以root身份运行mysqld?

当我谷歌如何以root身份运行mysqld的,我觉得在instructions on how to NOT run as root间接地给出了答案。其中包括以user_name身份运行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.cnf。所述directions for the MySql Docker图像提醒安装在/etc/mysql/conf.d其在上述的my.cnf引用的体积。 (这样做会覆盖在默认情况下是有2个配置文件,所以我在Dockerfile使用COPY命令,而不是仅仅增加一个配置文件)文件不使其进入容器:

[email protected]:/etc/mysql/conf.d# cat my.cnf 
[mysqld] 
user=root 

一个进一步的要求从MySql手册是将--user=root参数添加到mysqld。官方的MySql映像通过它的CMD调用mysqld,所以我在我的Dockerfile中覆盖它。我的CMD命令确实运行(这是在2个地方运行MySQL官方形象的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 = I提供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" "[email protected]" 
fi 

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

以root身份运行mysqld只需不支持由官方的MySql Docker映像?

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

我不知道是否存在更好的方法但这个工程。


查看官方entrypoint.sh,它似乎已经不支持换款默认mysql用户 我意识到如何MySQL的root身份运行的,但你必须已经初始化的数据目录。

步骤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 
[email protected]:/# 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