从命令行和 python api docker exec 中的管道
pipeline in docker exec from command line and from python api
我尝试实现的是在容器中调用 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)"
我的问题:
有没有更优雅的方式来实现我的目标?
你就快完成了,你只需要添加 -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
我尝试实现的是在容器中调用 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)"
我的问题:
有没有更优雅的方式来实现我的目标?
你就快完成了,你只需要添加 -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