Bash:文件未使用“>”命令创建

时间:2019-05-28 14:28:41

标签: 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时,我可以看到转储的内容并且它们是正确的。

这是怎么回事?

1 个答案:

答案 0 :(得分:0)

shell重定向

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

...将通过您的 local 外壳展开,而不是在容器内部展开。意味着文件被写入本地文件系统而不是容器的文件系统。