我正在编写一个脚本来创建在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
时,我可以看到转储的内容并且它们是正确的。
这是怎么回事?
答案 0 :(得分:0)
shell重定向
docker-compose exec db mysqldump ... > "$docker_backup_path"
docker-compose exec db mysqldump ... > "/opt/booking-backup/dump_prod.sql"
# -----------------------------------^ here
...将通过您的 local 外壳展开,而不是在容器内部展开。意味着文件被写入本地文件系统而不是容器的文件系统。