从命令行和从python apidocker执行程序中的pipe道

我试图实现的是在容器中调用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'] 

logging仪事件如下:

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

我的问题:

有没有更优雅的方法来存档我的目标?

你几乎在那里,你只需要添加-i标志来使pipe道工作:

 -i, --interactive Keep STDIN open even if not attached docker exec -i container-name mysqldump [options] database > database.sql.xz 

我通过文件redirectreplace了pipe道,但它将与pipe道一样工作。 只要确保不要使用-t选项,因为这会破坏它。


额外:

要将sql转储导入到mysql中:

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

这个小脚本会检测我是否在pipe道中运行mysql。

 #!/bin/bash if [ -t 0 ]; then docker exec -it container-name mysql "$@" else docker exec -i container-name mysql "$@" fi