【问题标题】:How to run a script shell just after the Dockerfile 'CMD ["mysqld"]'?如何在 Dockerfile 'CMD ["mysqld"]' 之后运行脚本 shell?
【发布时间】: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


【解决方案1】:

如果您使用的是official image for MariaDB,您只需将脚本添加到文件夹/docker-entrypoint-initdb.d/*

看看docker-entrypoint.sh script

  • 第 110 行 - 脚本正在等待实例运行并接受查询。
  • 第 178 行 - 脚本从目录 /docker-entrypoint-initdb.d/* 运行自定义脚本

因此,您只需将更改密码脚本添加到正确的位置,它就会在实例准备好更新密码后运行。您不必更改 CMDENTRYPOINT 值。

【讨论】:

  • 非常感谢,@rom...我正在尝试这种策略,但到目前为止还没有奏效。在这里回想一下,当我在运行时使用UPDATE 更改密码时,它可以完美运行,但是通过/docker-entrypoint-initdb.d/ 应用相同的SQL 脚本时问题仍然存在,但至少现在它在MariaDB 启动后运行。在 SQL 脚本中,如果我使用 UPDATEALTER 命令它会返回 sintax 错误,如果我使用 SET 它会返回 proxies_priv 错误,如下所示。 [Warning] 'proxies_priv' entry '@% root@ae5131a14387' ignored in --skip-name-resolve mode.
  • new_vault.sql UPDATE mysql.user SET authentication_string=PASSWORD("root-test") WHERE User="root"; UPDATE mysql.user SET authentication_string=PASSWORD("pass-test") WHERE User="efaz"; UPDATE mysql.user SET plugin="mysql_native_password"; FLUSH PRIVILEGES; 输出错误 [Warning] ''user'' entry ''root@42bb3c6e2862'' ignored in --skip-name-resolve mode. [Warning] ''proxies_priv'' entry ''@% root@42bb3c6e2862'' ignored in --skip-name-resolve mode. Reading of all Master_info entries succeded Added new Master_info '''' to hash table mysqld: ready for connections.
猜你喜欢
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 2021-08-11
相关资源
最近更新 更多