首页 > 解决方案 > Helm mysql.initializationFiles 中的 Db 迁移导致 pod 崩溃

问题描述

我正在构建一个带有 MySQL 依赖项的掌舵图。它在空时设置得很好,但我想sh在 pod 上运行一个文件,该文件将从其他地方复制一些数据。为此,我想使用initializationFiles文档https://github.com/helm/charts/tree/master/stable/mysql中的结构

我与此依赖相关的 values.yaml 部分如下所示:

mysql:
  mysqlRootPassword: somePass
  mysqlPassword : somePass
  mysqlUser: user
  appPassword: somePass
  initializationFiles:
    db.sh: |-
      #!/bin/sh
      touch dump.sql

看起来initializationFiles节下的代码被尝试执行并导致 pod 失败。由于此节仅按设计执行一次,因此第二次尝试成功,并且当 pod 运行时,我看不到任何新文件kubectl exec -it pod_name -- bash -c ls

我试过这个:

...
  initializationFiles:
    - db.sh

并将 db.sh 文件放在与 相同的文件夹中values.yaml,但这仍然不起作用。sh设置依赖项 MySQL pod 时执行文件的正确方法是什么?Kubernetes 版本 1.17,掌舵 3.5.0

我看到该文件实际上被复制到了docker-entrypoint-initdb.d,但它没有被执行,没有创建新文件。

root@mypod:/docker-entrypoint-initdb.d# ls -la
lrwxrwxrwx 1 root root 12 Mar  6 00:14 db.sh -> ..data/db.sh
root@mypod:/docker-entrypoint-initdb.d# cat db.sh
#!/bin/sh
touch dump.sql

我尝试手动运行该文件,但权限被拒绝:

root@mypod:/# ./docker-entrypoint-initdb.d/db.sh
bash: ./docker-entrypoint-initdb.d/db.sh: Permission denied

如果我将命令更改为echo test然后执行 sh 文件,我可以在 pod 的日志中看到这一点。看起来像更改文件系统是被禁止的,但是做touch /dump.sqltouch /home/dump.sql不工作。

标签: mysqlkuberneteskubernetes-helm

解决方案


MUAHAHA 我做到了。里面的脚本./docker-entrypoint-initdb.d/是由mysql用户执行的。

在 pod 内四处逛逛后,我找到了一个mysql用户具有写入权限的目录。所以我只是把文件写在那里然后删除来初始化数据库。现在整个节看起来像这样:

mysql:
  mysqlRootPassword: myPass
  mysqlPassword : myPass
  mysqlUser: user
  appPassword: myPass
  initializationFiles:
    db.sh: |-
      #!/bin/sh
      mysqldump -h remoteDbUrl -u remoteUser -pRemotePass --databases db1 db2 > /var/lib/mysql/dump.sql
      mysql -uroot -pmyPass < /var/lib/mysql/dump.sql
      rm /var/lib/mysql/dump.sql
      echo "GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'myPass';" | mysql -uroot -pmyPass


推荐阅读