我正在尝试从 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 -
这就像一个魅力。
有人可以向我解释一下,我在前一个例子中做错了什么吗?预先感谢!
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 -