Docker中使用mariabackup无法连接MariaDB的问题求助
解决MariaDB容器中mariabackup无法通过socket连接的问题
问题背景
现有可正常运行的Docker Compose配置(WordPress + MariaDB):
version: '3.1' services: wordpress: image: wordpress restart: always ports: - 8080:80 environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: wp_user WORDPRESS_DB_PASSWORD: password WORDPRESS_DB_NAME: wp_db volumes: - ./wordpress:/var/www/html networks: - my_network db: image: mariadb:10.7.8 restart: always environment: MYSQL_DATABASE: wp_db MYSQL_USER: wp_user MYSQL_PASSWORD: password MYSQL_ROOT_PASSWORD: password MARIADB_MYSQL_LOCALHOST_USER: 1 MARIADB_MYSQL_LOCALHOST_GRANTS: "RELOAD, PROCESS, LOCK TABLES, BINLOG MONITOR" volumes: - ./data:/docker-entrypoint-initdb.d - ./datadir:/var/lib/mysql - backup:/backup networks: - my_network volumes: backup: networks: my_network: driver: bridge
执行以下备份命令时出现错误:
docker compose run db mariabackup --backup --target-dir=/backup
错误输出:
[00] 2023-03-18 16:32:15 Connecting to MariaDB server host: localhost, user: not set, password: not set, port: not set, socket: /run/mysqld/mysqld.sock [00] 2023-03-18 16:32:15 Failed to connect to MariaDB server: Can't connect to local server through socket '/run/mysqld/mysqld.sock' (2 "No such file or directory").
疑惑点:socket路径显示为/run/mysqld/mysqld.sock,预期应为/var/run/mysqld/mysqld.sock。
解决方案
核心原因
docker compose run会启动一个全新的容器实例,而非连接到正在运行的db容器。这个新容器里的MariaDB服务并未启动,所以找不到socket文件;另外,该MariaDB镜像的默认socket路径确实是/run/mysqld/mysqld.sock,但服务未启动时文件自然不存在。
正确执行命令
要在已运行的db容器中执行备份,需使用docker compose exec命令,同时指定拥有备份权限的数据库用户和密码:
docker compose exec db mariabackup --backup --user=root --password=password --target-dir=/backup
额外说明
- 如果需要显式指定socket路径,可以添加
--socket参数,不过在运行中的容器里默认路径是有效的,一般无需额外指定:
docker compose exec db mariabackup --backup --user=root --password=password --socket=/run/mysqld/mysqld.sock --target-dir=/backup
- 确认
backup卷已正确挂载,备份文件会保存到这个持久化卷中,不会随容器销毁丢失。
内容的提问来源于stack exchange,提问作者Zakalwe
相关产品推荐
相关产品推荐

