我正在尝试创建一个符合OpenShift标准的预填充MySQL容器映像。
使用指定用户运行容器(遗憾的是)不是我们的选择。
这是一个问题,因为OpenShift只是创建了一个没有用户名的随机UID,因此在启动MySQL服务之前在运行时使用脚本设置用户名不是一种选择。
有没有办法让MySQL与docker容器中的任何随机UID一起运行?
编辑:
这个问题背后的想法是能够像这样启动一个MySQL容器
Dockerfile
randomusermysql:example
FROM mysql:5.7.22
#IMPORTANT: MySQL Container runs init in alphanumerical order!
COPY src/some.sql /docker-entrypoint-initdb.d/
ENV MYSQL_ROOT_PASSWORD='somepw'
RUN mkdir -p /var/lib/mysql2 && \
chown -R mysql:mysql /var/lib/mysql2 && \
chmod -R 777 /var/lib/mysql2 && \
sed -i 's|/var/lib/mysql|/var/lib/mysql2|g' /etc/mysql/mysql.conf.d/mysqld.cnf && \
sed -i 's|exec "$@"||g' /entrypoint.sh && \
/entrypoint.sh mysqld && \
chmod -R 777 /var/lib/mysql2/ && \
chown -R mysql:mysql /var/lib/mysql2 && \
find /var/lib/mysql2/ -name "*.cnf" -exec chmod 775 {} \; && \
echo 'exec "$@"' >> /entrypoint.sh
然后像这样开始
docker run -u 123456789 randomusermysql:example
启动容器时导致以下错误
2018-05-22T11:39:35.084034Z 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table storage engine for 'user' doesn't have this option
2018-05-22T11:39:35.084235Z 0 [ERROR] Aborting
启动容器
时,无法将用户作为docker ENV
传递
edit2:赏金文字不正确
更正了赏金声明:
预填充MySQL数据库需要一个解决方案,而不只是将转储文件复制到/docker-entrypoint-initdb.d目录中!
答案 0 :(得分:3)
问题在于,如果您在所需位置预先创建数据库文件作为图像的一部分,那么他们将拥有与创建它们的Dockerfile
相同的用户。您不会事先知道用户是什么,因此无法匹配数据库可能启动的内容,导致MySQL在启动时失败,因为拥有数据库文件的目录与启动它的目录不同。 / p>
我看到的唯一解决方案是将数据库文件添加到某个位置的tar文件中的图像中。在数据库的启动命令中,为数据库创建目录并将tar文件解压缩到其中。这样,目录和文件将成为MySQL运行的用户。
请注意,您需要创建数据库目录创建位置的父目录,按组分组并按组写入,以便在映像运行时创建数据库目录,作为没有passwd文件的任意用户ID条目。在这种情况下,组ID将回退为root组,因此将允许创建数据库目录。
答案 1 :(得分:0)
问题在于passwd文件中和组文件中不存在的随机uid。
我在mssql的github页面上发布了一个解决方案: https://github.com/Microsoft/mssql-docker/issues/121#issuecomment-347766828
解决方案摘要: 我用lib-nss-wrapper创建了一个包装器,以便进程能够查找随机uid。
如果您需要进一步的说明,请与我们联系。