首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将mysqld作为根用户运行在正式的MySql码头映像中?

问如何将mysqld作为根用户运行在正式的MySql码头映像中?
EN

Stack Overflow用户
提问于 2017-06-16 14:50:20
回答 1查看 7.3K关注 0票数 3

首先,我知道不能正常运行。我有一种异常情况:我需要使用mysqldump和--tab参数,它需要写入磁盘的权限,并且我希望在Docker容器之外使用这些文件。我可以解释为什么将mysqld作为root运行使这更容易,但这个问题还不够长吗?在这种情况下,以root方式运行是安全的,因为容器只用于运行测试和更新基于SQL迁移脚本的DB备份脚本,并且它将开始执行1项工作,然后再重新删除。

当我在谷歌上搜索如何将mysqld作为根运行时,我会在关于如何不以root用户身份运行的说明中找到间接的答案。除其他外,为了将mysqld作为user_name运行:

以用户user_name的身份启动服务器。另一种选择是以Unix根用户的身份启动mysqld并使用-- user =user_name选项。 若要在系统启动时自动以给定用户身份启动服务器,请将用户选项添加到服务器数据目录中的/etc/my.cnf选项文件或my.cnf选项文件的mysqld组中,从而指定用户名。

我们要做其中的一个吗?这两个?我假设两者都是以防万一。但是,它们真的是指/etc/my.cnf吗?还是这取决于安装(例如,哪个Linux发行版)?例如,码头形象mysql:5.6有/etc/mysql/my.cnf。MySql码头操作指南图像建议在/etc/mysql/conf.d安装一个卷,该卷在前面的my.cnf中引用。(这样做会覆盖默认存在的2个配置文件,因此我在Dockerfile中使用了COPY命令,而只是添加了一个配置文件。)该文件确实会进入容器中:

代码语言:javascript
复制
root@4f612d10a690:/etc/mysql/conf.d# cat my.cnf
[mysqld]
user=root

MySql手册中的另一个要求是将--user=root参数添加到mysqld。正式的MySql映像通过它的CMD调用mysqld,所以我在我的文件中覆盖它。我的CMD命令确实运行(它运行在官方MySql映像的入口点脚本中的两个位置):

代码语言:javascript
复制
# 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:

代码语言:javascript
复制
FROM mysql:5.6
VOLUME ["/var/lib/mysql-files"]
COPY ["my.cnf", "/etc/mysql/conf.d"]
CMD ["mysqld", "--user=root"]

关于它为什么不以root的形式运行,我唯一的猜测是,它们mysql映像的入口点脚本在运行前会更改到mysql用户:

代码语言:javascript
复制
# 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 )。

将mysqld作为根用户运行只是官方的MySql码头映像不支持吗?

EN

回答 1

Stack Overflow用户

发布于 2017-06-16 15:21:15

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

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

从官方的entrypoint.sh来看,它似乎不支持约束默认的mysql用户--我认识到如何将mysql作为根用户运行,但是您需要已经初始化了数据目录。

步骤1)启动正常的mysql以初始化卷( mysql entrypoint.sh将完成该工作):

代码语言:javascript
复制
docker run \
  --rm \
  -v $(pwd)/mysql/:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD="abc" \
mysql:5.6

第2步)停止并移除该容器:

代码语言:javascript
复制
 docker stop <container-id>

步骤3)根据已经创建的数据dir再次启动一个新的mysql进程,但这次要避免运行正式的mysql入口点:

代码语言:javascript
复制
docker run \
  -v $(pwd)/mysql/:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD="abc" \
  --entrypoint mysqld \
mysql:5.6 \
  --user root

第4步)检查它:

代码语言:javascript
复制
▶ 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44592222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档