mirror of
https://github.com/mailcow/mailcow-dockerized.git
synced 2026-02-13 16:00:38 +00:00
[Mysql] use python bootstrapper to start MYSQL container
This commit is contained in:
@@ -23,6 +23,8 @@ def main():
|
||||
from modules.BootstrapRspamd import Bootstrap
|
||||
elif container_name == "clamd-mailcow":
|
||||
from modules.BootstrapClamd import Bootstrap
|
||||
elif container_name == "mysql-mailcow":
|
||||
from modules.BootstrapMysql import Bootstrap
|
||||
else:
|
||||
print(f"No bootstrap handler for container: {container_name}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
@@ -31,9 +33,9 @@ def main():
|
||||
container=container_name,
|
||||
db_config={
|
||||
"host": "localhost",
|
||||
"user": os.getenv("DBUSER"),
|
||||
"password": os.getenv("DBPASS"),
|
||||
"database": os.getenv("DBNAME"),
|
||||
"user": os.getenv("DBUSER") or os.getenv("MYSQL_USER"),
|
||||
"password": os.getenv("DBPASS") or os.getenv("MYSQL_PASSWORD"),
|
||||
"database": os.getenv("DBNAME") or os.getenv("MYSQL_DATABASE"),
|
||||
"unix_socket": "/var/run/mysqld/mysqld.sock",
|
||||
'connection_timeout': 2
|
||||
},
|
||||
|
||||
80
data/Dockerfiles/bootstrap/modules/BootstrapMysql.py
Normal file
80
data/Dockerfiles/bootstrap/modules/BootstrapMysql.py
Normal file
@@ -0,0 +1,80 @@
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
from modules.BootstrapBase import BootstrapBase
|
||||
from pathlib import Path
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import platform
|
||||
import subprocess
|
||||
|
||||
class Bootstrap(BootstrapBase):
|
||||
def bootstrap(self):
|
||||
self.upgrade_mysql()
|
||||
|
||||
# Setup Jinja2 Environment and load vars
|
||||
self.env = Environment(
|
||||
loader=FileSystemLoader('./etc/mysql/conf.d/config_templates'),
|
||||
keep_trailing_newline=True,
|
||||
lstrip_blocks=True,
|
||||
trim_blocks=True
|
||||
)
|
||||
extra_vars = {
|
||||
}
|
||||
self.env_vars = self.prepare_template_vars('/overwrites.json', extra_vars)
|
||||
|
||||
print("Set Timezone")
|
||||
self.set_timezone()
|
||||
|
||||
print("Render config")
|
||||
self.render_config("my.cnf.j2", "/etc/mysql/conf.d/my.cnf")
|
||||
|
||||
def upgrade_mysql(self, max_retries=5, wait_interval=3):
|
||||
"""
|
||||
Runs mysql_upgrade in a controlled way using run_command.
|
||||
Starts mysqld in background, upgrades, shuts down, then restarts in foreground.
|
||||
"""
|
||||
|
||||
dbuser = "root"
|
||||
dbpass = os.getenv("MYSQL_ROOT_PASSWORD", "")
|
||||
socket = "/var/run/mysqld/mysqld.sock"
|
||||
|
||||
print("Starting temporary mysqld for upgrade...")
|
||||
temp_proc = subprocess.Popen([
|
||||
"mysqld",
|
||||
"--user=mysql",
|
||||
"--skip-networking",
|
||||
f"--socket={socket}"
|
||||
])
|
||||
|
||||
self.connect_mysql()
|
||||
|
||||
print("Running mysql_upgrade...")
|
||||
retries = 0
|
||||
while retries < max_retries:
|
||||
result = self.run_command([
|
||||
"mysql_upgrade",
|
||||
"-u", dbuser,
|
||||
f"-p{dbpass}",
|
||||
f"--socket={socket}"
|
||||
], check=False)
|
||||
|
||||
if result.returncode == 0:
|
||||
print("mysql_upgrade completed successfully.")
|
||||
break
|
||||
else:
|
||||
print(f"mysql_upgrade failed (try {retries+1}/{max_retries})")
|
||||
retries += 1
|
||||
time.sleep(wait_interval)
|
||||
else:
|
||||
print("mysql_upgrade failed after all retries.")
|
||||
temp_proc.terminate()
|
||||
return False
|
||||
|
||||
print("Shutting down temporary mysqld...")
|
||||
self.run_command([
|
||||
"mariadb-admin",
|
||||
"shutdown",
|
||||
f"--socket={socket}",
|
||||
"-u", dbuser,
|
||||
f"-p{dbpass}"
|
||||
])
|
||||
Reference in New Issue
Block a user