通过管道将 tar 存档传输到主机在 docker run 上失败,但在 docker exec 上可以工作

问题描述 投票:0回答:1

我正在尝试从 Docker 映像中获取一些库,因为我暂时在另一个环境中需要它。

由于我需要符号链接来持续执行此操作,因此我尝试 tar 目录并将其通过管道传输到我的热系统以立即在那里解压它。最后,我想将它们直接通过管道传输到正在运行的 Kubernetes Pod 中。

由于我没有任何运行该图像的环境,因此我需要其中的文件,因此我尝试执行以下操作:

docker run --rm bitnami/postgresql:11.22.0-debian-11-r4 \
    tar cf - -C /usr/lib/x86_64-linux-gnu . | tar xf -

这会导致

tar: This does not look like a tar archive
tar: Skipping to next header
tar: Exiting with failure status due to previous errors
write /dev/stdout: broken pipe

但是当我在已经运行的容器中执行此操作时,它可以工作。

使用镜像启动一个 docker 容器并打开 bash(这样它不会启动 postgres 服务,但保持活动状态):

docker run --rm -it --name my-postgresql bitnami/postgresql:11.22.0-debian-11-r4 -- bash

无需在主机上打开新终端并执行以下命令:

docker exec my-postgresql \
    tar cf - -C /usr/lib/x86_64-linux-gnu/ . |\
    tar xf -

这就像一个魅力。

有人可以向我解释一下,我在前一个例子中做错了什么吗?预先感谢!

docker tar docker-run docker-exec
1个回答
1
投票

bitnami postgres 映像包含一个 ENTRYPOINT 脚本:

$ docker image inspect bitnami/postgresql:11.22.0-debian-11-r4   -f '{{ .Config.Entrypoint }}'
[/opt/bitnami/scripts/postgresql/entrypoint.sh]

该脚本在

tar
产生任何输出之前在 stdout 上产生一些输出;这会导致读取
tar
命令无法处理数据。您可以通过替换入口点来避免该问题:

docker run --rm --entrypoint tar bitnami/postgresql:11.22.0-debian-11-r4 \
  cf - -C /usr/lib/x86_64-linux-gnu . |
  tar xf -
© www.soinside.com 2019 - 2024. All rights reserved.