mysql - Bash:文件不是使用 '>' 命令创建的

标签 mysql bash shell docker docker-compose

我正在编写一个脚本来创建在 Docker 容器中运行的 MySQL 数据库的备份。数据库已正确启动并运行。

我当前的代码是

#!/bin/bash
PATH=/usr/bin:/usr/local/bin:/root/.local/bin:$PATH

docker-compose exec -T db mkdir -p /opt/booking-backup

docker_backup_path="/opt/booking-backup/dump_prod_$(date +%F_%R).sql"
copy_backup_path="/root/backup_scripts/booking_prod/dump_prod_$(date +%F_%R).sql"

docker-compose exec db mysqldump --add-drop-database --add-drop-table --user=root --password="pw" booking > "$docker_backup_path"
docker-compose exec db mysqldump --add-drop-database --add-drop-table --user=root --password="pw" booking > "/opt/booking-backup/dump_prod.sql"

[ -d ./backup ] || mkdir ./backup
docker cp $(docker-compose ps -q db):$docker_backup_path $copy_backup_path

但是,当我执行它时,它会抛出此错误:

Error: No such container:path: f0baa241becd20d2690bb901fb257a4bbec8cac17e6f1ce6d50adb9532bbae03:/opt/booking-backup/dump_prod_2019-05-28_14:23.sql

更奇怪的是,我有完全相同的代码(但将 booking 切换为 abc,并使用 PSQL 而不是 MySQL)可以正常工作。

看来这一行

docker-compose exec db mysqldump --add-drop-database --add-drop-table --user=root --password="pw" booking > $docker_backup_path

确实没有创建输出文件,但是当我使用tee时,我可以看到转储的内容并且它们是正确的。

这里出了什么问题?

最佳答案

shell 重定向

docker-compose exec db mysqldump ... > "$docker_backup_path"
docker-compose exec db mysqldump ... > "/opt/booking-backup/dump_prod.sql"
# -----------------------------------^ here

...将由您的本地 shell 扩展,而不是在容器内扩展。这意味着文件将写入本地文件系统而不是容器的文件系统。

关于mysql - Bash:文件不是使用 '>' 命令创建的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56344458/

相关文章:

Linux,如何执行可执行/不可执行文件?

sql - 在数据库中存储时间温度数据

php - 表单数据未发送到 MySql 数据库

linux - 返回主菜单后 Bash 脚本不执行更多命令

sql - 从 bash 创建 postgresql 时出错 - 安装和导入

regex - 用 sed 替换正则表达式组

linux - 使用 Bash 脚本查找文件中字符串的行号

mysql - ALTER TABLE 添加约束

使用 HAVING 的 MySQL 查询错误地限制了结果

bash 存储变量并使结果静音