我正在尝试创建一个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目录中!
2条答案
按热度按时间hmtdttj41#
问题是passwd文件和组文件中都不存在随机uid。
我在mssql的github页面上发布了一个解决方案:https://github.com/microsoft/mssql-docker/issues/121#issuecomment-347766828
解决方案摘要:我使用lib nss wrapper创建了一个 Package 器,以便进程能够查找随机uid。
如果你需要进一步的指示,请告诉我。
cyvaqqii2#
问题是,如果您在所需位置预创建数据库文件作为映像的一部分,则它们将与
Dockerfile
创造了它们。您将无法预先知道用户是什么,因此无法匹配数据库的启动方式,从而导致mysql在启动时失败,因为拥有数据库文件的目录与它的启动方式不同。我见过的唯一解决方案是将数据库文件添加到某个位置的tar文件中的图像中。在数据库的启动命令中,为数据库创建目录并将tar文件解压到其中。这样,目录和文件就是mysql运行的用户。
请注意,您需要将要创建数据库目录的父目录设为组根目录,并可按组写入,以便在映像作为没有passwd文件条目的任意用户id运行时创建数据库目录。在这种情况下,组id将回退为根组,从而允许创建数据库目录。