来自命令行和python api的docker exec中的管道

pin*_*ngz 8 python pipeline docker dockerpy

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

首先我尝试下面的命令:

$ docker exec container-name mysqldump [options] database | xz > database.sql.xz
Run Code Online (Sandbox Code Playgroud)

这不起作用,所以我尝试另一个是:

$ docker exec container-name bash -c 'mysqldump [options] database | xz > database.sql.xz'
Run Code Online (Sandbox Code Playgroud)

这次它奏效了.

但那真的很蹩脚.

然后我尝试使用docker-py这个时间cmd选项,看起来像这样:

cmd=['bash', '-c', 'mysqldump [options]  database | xz > database.sql.xz']
Run Code Online (Sandbox Code Playgroud)

记录器事件如下:

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

我的问题:

存档我的目标有更优雅的方式吗?

小智 21

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

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

docker exec -i container-name mysqldump [options] database > database.sql.xz
Run Code Online (Sandbox Code Playgroud)

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


额外:

要将sql转储导回到mysql:

docker exec -i container-name mysql [options] database < database.sql.xz
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/bash
if [ -t 0 ]; then
    docker exec -it container-name mysql "$@"
else
    docker exec -i container-name mysql "$@"
fi
Run Code Online (Sandbox Code Playgroud)

  • 更深入地解释为什么-t会破坏它会很好:) (4认同)
  • 对于那些希望导入数据库文件(如上所述,但使用 docker-compose)的人来说,以下内容可能会有所帮助:`docker-compose exec -T SERVICE mysql database &lt;database.sql.xz` 使用 `-T` 将禁用伪- tty 分配允许您在没有 tty 的情况下保持标准输入打开。 (4认同)
  • 我不明白这是如何在容器内创建文件的。使用“&lt;”读取我总是得到“bash:/app/db/database.sql:没有这样的文件或目录”。相反,它似乎是在您本地的系统上创建文件。 (3认同)