docker 中没有 root 的 Mariadb init
Mariadb init without root in docker
我尝试创建一个 mariadb 10.4.10 docker 图像。在 docker 文件中,我只是将 mariadb 安装到图像中。 docker 文件继承自我的个人自定义 alpine 图像,将在其中创建用户 "appuser"。
FROM nwo/alpine:latest
LABEL MAINTAINER="dideldumm <123@abc.de>"
ARG IMAGE_NAME=nwo/mariadb
ARG IMAGE_VERSION=1.1
RUN apk update \
&& apk add mariadb \
mariadb-client \
&& rm -rf /var/lib/apt/lists/* \
&& rm -rf /var/cache/apk/*
COPY ./setup/setup.sql /home/appuser/app/setup.sql
COPY ./setup/start.sh /home/appuser/app/start.sh
RUN chown appuser:appuser /home/appuser/app/start.sh /home/appuser/app/setup.sql
RUN mkdir /home/appuser/data/db \
&& mkdir /home/appuser/data/log \
&& touch /home/appuser/app/mariadb.pid \
&& touch /home/appuser/app/mariadb.socket \
&& chown -R appuser:appuser /home/appuser/data/db \
&& chown -R appuser:appuser /home/appuser/data/log \
&& chown -R appuser:appuser /home/appuser/app/mariadb.socket \
&& chown -R appuser:appuser /home/appuser/app/mariadb.pid
USER appuser
ENTRYPOINT ["/home/appuser/app/start.sh"]
在 start.sh 脚本中我创建了 mariadb.cnf.
echo "Create mariadb configuration file"
echo "[mysqld]" > /home/appuser/data/mariadb.cnf
echo "port=3306" >> /home/appuser/data/mariadb.cnf
echo "socket=/home/appuser/app/mariadb.socket" >> /home/appuser/data/mariadb.cnf
echo "pid-file=/home/appuser/app/mariadb.pid" >> /home/appuser/data/mariadb.cnf
echo "datadir=/home/appuser/data/db" >> /home/appuser/data/mariadb.cnf
echo "symbolic-links=0" >> /home/appuser/data/mariadb.cnf
echo "bind-address=0.0.0.0" >> /home/appuser/data/mariadb.cnf
echo "console=1" >> /home/appuser/data/mariadb.cnf
echo "general_log=0" >> /home/appuser/data/mariadb.cnf
echo "general_log_file==/home/appuser/data/log/mariadb.log" >> /home/appuser/data/mariadb.cnf
echo "log_error=/home/appuser/data/log/mariadb_error.log" >> /home/appuser/data/mariadb.cnf
echo "collation-server=$MDB_COLLATION" >> /home/appuser/data/mariadb.cnf
echo "character-set-server=$MDB_CHARACTERSET" >> /home/appuser/data/mariadb.cnf
之后我运行mysql_install_db --defaults-file=/home/appuser/data/mariadb.cnf
。在控制台输出中,我收到消息说我只能使用系统根帐户访问根用户。但是正如您在 docker 文件中看到的那样,我切换到 appuser,然后切换到 运行 start.sh,这使得 运行 sudo 变得不可能。我的目标是在 start.sh.
内初始化没有特权的 mariadb
我尝试使用参数 --skip-grant-tables
运行 mysqld
但是我无法设置 root 密码。这导致 ALTER USER
和 SET PASSWORD
语句的错误消息 The MariaDB server is running with the --skip-grant-tables option so it cannot execute this statement
。
当我在 运行 之前 "FLUSH PRIVILEGES" 时,每个命令(SET PASSWORD,ALTER USER)都会导致 Query OK, 0 rows affected
。至少我尝试用 UPDATE mysql.user SET Password=PASSWORD('test3') WHERE USER='root' AND Host='localhost';
更新用户,结果是 ERROR 1348 (HY000): Column 'Password' is not updatable
。
到目前为止,我完全不知道如何在没有 root 权限的情况下配置 mysql 数据库服务器。
如果你能给我一个解决方案那就太好了。
此致
戴夫
自己找到了解决办法。第一个问题是,在我的环境中,只创建了 "root" 而没有第二个用户。不知道为什么,但之后我让 运行 一个脚本来执行此操作,所以它对我来说并不那么重要。
要获得 "old style" 10.3 root 用户行为(使您能够使用非 root 用户安装 mariadb),您可以 运行 mysql_install_db
和参数 --auth-root-authentication-method=normal
。
当然,之后您必须自己保护您的 mariadb 安装。
问候戴夫
我尝试创建一个 mariadb 10.4.10 docker 图像。在 docker 文件中,我只是将 mariadb 安装到图像中。 docker 文件继承自我的个人自定义 alpine 图像,将在其中创建用户 "appuser"。
FROM nwo/alpine:latest
LABEL MAINTAINER="dideldumm <123@abc.de>"
ARG IMAGE_NAME=nwo/mariadb
ARG IMAGE_VERSION=1.1
RUN apk update \
&& apk add mariadb \
mariadb-client \
&& rm -rf /var/lib/apt/lists/* \
&& rm -rf /var/cache/apk/*
COPY ./setup/setup.sql /home/appuser/app/setup.sql
COPY ./setup/start.sh /home/appuser/app/start.sh
RUN chown appuser:appuser /home/appuser/app/start.sh /home/appuser/app/setup.sql
RUN mkdir /home/appuser/data/db \
&& mkdir /home/appuser/data/log \
&& touch /home/appuser/app/mariadb.pid \
&& touch /home/appuser/app/mariadb.socket \
&& chown -R appuser:appuser /home/appuser/data/db \
&& chown -R appuser:appuser /home/appuser/data/log \
&& chown -R appuser:appuser /home/appuser/app/mariadb.socket \
&& chown -R appuser:appuser /home/appuser/app/mariadb.pid
USER appuser
ENTRYPOINT ["/home/appuser/app/start.sh"]
在 start.sh 脚本中我创建了 mariadb.cnf.
echo "Create mariadb configuration file"
echo "[mysqld]" > /home/appuser/data/mariadb.cnf
echo "port=3306" >> /home/appuser/data/mariadb.cnf
echo "socket=/home/appuser/app/mariadb.socket" >> /home/appuser/data/mariadb.cnf
echo "pid-file=/home/appuser/app/mariadb.pid" >> /home/appuser/data/mariadb.cnf
echo "datadir=/home/appuser/data/db" >> /home/appuser/data/mariadb.cnf
echo "symbolic-links=0" >> /home/appuser/data/mariadb.cnf
echo "bind-address=0.0.0.0" >> /home/appuser/data/mariadb.cnf
echo "console=1" >> /home/appuser/data/mariadb.cnf
echo "general_log=0" >> /home/appuser/data/mariadb.cnf
echo "general_log_file==/home/appuser/data/log/mariadb.log" >> /home/appuser/data/mariadb.cnf
echo "log_error=/home/appuser/data/log/mariadb_error.log" >> /home/appuser/data/mariadb.cnf
echo "collation-server=$MDB_COLLATION" >> /home/appuser/data/mariadb.cnf
echo "character-set-server=$MDB_CHARACTERSET" >> /home/appuser/data/mariadb.cnf
之后我运行mysql_install_db --defaults-file=/home/appuser/data/mariadb.cnf
。在控制台输出中,我收到消息说我只能使用系统根帐户访问根用户。但是正如您在 docker 文件中看到的那样,我切换到 appuser,然后切换到 运行 start.sh,这使得 运行 sudo 变得不可能。我的目标是在 start.sh.
我尝试使用参数 --skip-grant-tables
运行 mysqld
但是我无法设置 root 密码。这导致 ALTER USER
和 SET PASSWORD
语句的错误消息 The MariaDB server is running with the --skip-grant-tables option so it cannot execute this statement
。
当我在 运行 之前 "FLUSH PRIVILEGES" 时,每个命令(SET PASSWORD,ALTER USER)都会导致 Query OK, 0 rows affected
。至少我尝试用 UPDATE mysql.user SET Password=PASSWORD('test3') WHERE USER='root' AND Host='localhost';
更新用户,结果是 ERROR 1348 (HY000): Column 'Password' is not updatable
。
到目前为止,我完全不知道如何在没有 root 权限的情况下配置 mysql 数据库服务器。
如果你能给我一个解决方案那就太好了。
此致
戴夫
自己找到了解决办法。第一个问题是,在我的环境中,只创建了 "root" 而没有第二个用户。不知道为什么,但之后我让 运行 一个脚本来执行此操作,所以它对我来说并不那么重要。
要获得 "old style" 10.3 root 用户行为(使您能够使用非 root 用户安装 mariadb),您可以 运行 mysql_install_db
和参数 --auth-root-authentication-method=normal
。
当然,之后您必须自己保护您的 mariadb 安装。
问候戴夫