您如何使用 运行 tar 命令将 docker 容器内的文件夹备份到主机?

How do you run a tar command to backup a folder inside a docker container to the host?

我的 docker 容器有一个我想定期备份到主机的目录。

我认为命令应该是这样的:

docker-compose exec SERVICE_NAME tar -czf - -C /dir/to/backup . > backup.tar.gz

这应该会在主机上创建一个名为 backup.tar.gz 的文件。

相反,tar 检测到输出似乎要发送到终端,并出现错误:

tar: Refusing to write archive contents to terminal (missing -f option?)
tar: Error is not recoverable: exiting now

据我所知,tar 命令没有 --force 或类似的东西。

有正确的方法吗?

这里有两种方法:

  1. 您可以使用 -T 选项告诉 docker compose 不分配 pty。

    示例:

    docker-compose exec -T SERVICE_NAME tar -czf - -C /dir/to/backup . > backup.tar.gz
    

    pty 的存在是大多数程序(包括 tar)检测它们是 运行 在终端中还是附加到管道的方式。

  2. 您可以通过使用 /dev/stdout 代替 - 来欺骗 tar 将输出写入终端。

    示例:

    $ tar -czf /dev/stdout etc/
    

    这使得 tar 将存档写入标准输出。请记住,此限制 exists for a reason.