docker run执行tar归档管道至宿主机失败,docker exec却正常
问题原因分析
你的docker run命令执行失败的核心原因是Bitnami PostgreSQL镜像的ENTRYPOINT脚本拦截了你的tar命令,具体细节如下:
- Bitnami官方镜像默认带有自定义的ENTRYPOINT启动脚本,当你执行
docker run [镜像] tar ...时,实际上是把tar cf - -C /usr/lib/x86_64-linux-gnu .作为参数传递给了这个ENTRYPOINT脚本,而非直接在容器内执行tar命令。 - 该ENTRYPOINT脚本会优先处理PostgreSQL的初始化启动逻辑,不会执行你传入的tar命令,导致输出的不是有效tar归档内容,而是脚本的日志或错误信息,因此宿主机的tar命令无法识别有效归档,抛出
This does not look like a tar archive错误。 - 而
docker exec是在容器启动完成后(ENTRYPOINT脚本已执行完毕,容器处于运行状态)直接执行tar命令,绕过了ENTRYPOINT的参数处理逻辑,所以能正常生成并传输tar归档。
解决方法
如果要直接用docker run完成归档传输,需要覆盖镜像的ENTRYPOINT,让容器直接执行tar命令:
docker run --rm --entrypoint tar bitnami/postgresql:11.22.0-debian-11-r4 \ cf - -C /usr/lib/x86_64-linux-gnu . | tar xf -
通过--entrypoint tar指定容器启动时直接执行tar命令,跳过原有的ENTRYPOINT脚本,即可正常生成tar归档并传输到宿主机解压。
内容的提问来源于stack exchange,提问作者Max N.
相关产品推荐
相关产品推荐

