【发布时间】:2019-06-12 17:46:02
【问题描述】:
我有一个在 Docker 容器上运行的 MariaDB 映像,出于安全原因,它必须在每次初始化时更新其 root 密码。有一个保管库服务器,我的容器每次初始化时都会从中获取新密码。获得新密码后,必须运行我的脚本才能登录 MariaDB 数据库并更新密码。一旦 MariaDB 数据库启动并运行,我已经尝试了几种策略来运行此类脚本,但到目前为止还没有成功。我确实使用 Dockerfile 来构建我的 MariaDB 扩展映像。最后,有一个启动服务的'CMD ["mysqld"]'。问题是我的脚本必须在“CMD [”mysqld“]”命令之后运行,因为它是初始化 MariaDB 进程的命令,然后它变成“准备连接”。
有没有什么办法可以在 MariaDB 服务启动并运行后运行我的 shell 脚本(["/foreground.sh"])?重要的是要记住在容器初始化后不允许人为操作。因此,每个操作都必须通过脚本 shell 进行,因为这个项目是针对生产环境的,我无法访问。
我的 Dockerfile 的相关部分
VOLUME /var/lib/mysql
EXPOSE 3306
COPY docker-entrypoint.sh /
COPY foreground.sh /
RUN chmod +x /docker-entrypoint.sh /foreground.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["mysqld"] ["/foreground.sh"]
我的“foreground.sh”的相关部分
mysql -u"root" -p"$ROOT_PASSWORD" <<MariaDB_INPUT
UPDATE mysql.user SET authentication_string=PASSWORD("$MYSQL_ROOT_PASSWORD_NEW_VAULT") WHERE USER="root";
UPDATE mysql.user SET authentication_string=PASSWORD("$MYSQL_PASSWORD_NEW_VAULT") WHERE USER="user";
UPDATE mysql.user SET plugin="mysql_native_password";
FLUSH PRIVILEGES;
quit
MariaDB_INPUT
【问题讨论】:
-
短格式:移动
mysqld进入foreground.sh(通常——在后台启动它,等待服务可用,运行你的设置,然后@ 987654325@ing 用于该后台服务,因此您的前台任务在服务退出之前不会退出)。 -
@CharlesDuffy,首先,感谢您的快速回答...您刚才建议的策略,我昨天尝试过,但没有成功。我收到以下错误消息。
2019-06-11 23:18:02 0 [ERROR] Could not open mysql.plugin table. Some plugins may be not loaded2019-06-11 23:18:02 0 [ERROR] Can't open and lock privilege tables: Table 'mysql.servers' doesn't exist2019-06-11 23:18:02 0 [Note] Server socket created on IP: '::'.2019-06-11 23:18:02 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist -
移动它以直接调用而不是通过 shell 并不能修复这些错误;无论哪种方式,该命令都以相同的权限运行。
-
@Charles,你能举个例子吗?
-
而不是将
mysqld移动到foreground.sh,而是将foreground.sh移动到docker-entrypoint.sh脚本中。如果你会阅读它,你会看到这个脚本以mysqld作为参数,并以不同的方式运行它。所以更改docker-entrypoint.sh脚本运行密码更改(或foreground.sh脚本)
标签: mysql docker docker-compose mariadb dockerfile