23

我尝试实现的是mysqldump在容器中调用并将数据库转储到容器自己的目录中。

起初我尝试以下命令:

$ docker exec container-name mysqldump [options] database | xz > database.sql.xz

那是行不通的,所以我尝试了另一个:

$ docker exec container-name bash -c 'mysqldump [options] database | xz > database.sql.xz'

这次奏效了。

但这真的很蹩脚。

然后我尝试使用 docker-py 这次工作的cmd选项看起来像这样:

cmd=['bash', '-c', 'mysqldump [options]  database | xz > database.sql.xz']

记录器事件如下:

level="info" msg="-job log(exec_start: bash -c mysqldump [options]  database | xz > database.sql.xz, fe58e681fec194cde23b9b31e698446b2f9d946fe0c0f2e39c66d6fe68185442, mysql:latest) = OK (0)"

我的问题:

有没有更优雅的方式来归档我的目标?

4

1 回答 1

43

你快到了,你只需要添加 -i 标志来使管道工作:

-i, --interactive    Keep STDIN open even if not attached

docker exec -i container-name mysqldump [options] database > database.sql.xz

我用文件重定向替换了管道,但它与管道相同。只要确保不要使用 -t 选项,因为这会破坏它。


额外的:

要将 sql 转储导入 mysql:

docker exec -i container-name mysql [options] database < database.sql.xz

这个小脚本将检测我是否在管道中运行 mysql:

#!/bin/bash
if [ -t 0 ]; then
    docker exec -it container-name mysql "$@"
else
    docker exec -i container-name mysql "$@"
fi
于 2016-03-07T11:04:11.680 回答