【发布时间】:2018-12-11 21:17:17
【问题描述】:
我正在使用wget 检索tar.gz 文件并使用tar -xzf 将其解压缩。如果我从正在运行的容器中运行tar 命令,它会成功解包并存储为init,然后我可以在其中使用./init 启动服务。
我遇到的问题是,当我在Dockerfile 中使用来自RUN 指令的相同tar 命令时,当docker build . 在RUN tar -xzf 命令。
这是我得到的错误:
OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"/bin/sh\": stat /bin/sh: no such file or directory": unknown
这是我用于测试的 Dockerfile:
FROM amazonlinux:2
RUN yum install -y wget tar gzip
wget https://github.com/just-containers/s6-overlay/releases/download/v1.19.1.1/s6-overlay-amd64.tar.gz
RUN tar -xzf s6-overlay-amd64.tar.gz
RUN echo "test"
注意:如果我将RUN tar -xzf 设置为Dockerfile 中的最后一条指令,它将成功构建,但尝试在容器中运行映像会导致同样的错误。
更多故障排除信息:
在容器内,我运行 which gzip 以确认 gzip 是从正确的路径 (/usr/bin/gzip) 使用的,我还运行了 file https://github.com/just-containers/s6-overlay/releases/download/v1.19.1.1/s6-overlay-amd64.tar.gz,它在最后产生了以下输出:
Length: 1713081 (1.6M) [application/octet-stream]
据我所知,octet-stream 仅表示该文件是二进制文件,扩展名应该足以告诉我这是一个gzip 文件。
不管它的价值是什么,我知道这个tar.gz 文件正在被成功解压到另一个工作的Dockerfile 中构建FROM alpine:3.6:https://hub.docker.com/r/webcenter/activemq/~/dockerfile/
我已尝试在引用的Dockerfile 中使用tar 命令,但总是以同样的错误告终。
【问题讨论】:
-
引用的 docker 文件将 curl 的输出直接通过管道传输到 tar 中,而无需创建临时文件。你试过方法吗?
-
@MisterSmith 是的,它可以工作,但是之后的任何
RUN命令在构建时都会出现以下错误:OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"/bin/sh\": stat /bin/sh: no such file or directory": unknown。我将把这个添加到问题中以澄清我已经尝试过原始方法。 -
tar 是一个实际的二进制文件还是指向其他东西的包装脚本?错误似乎暗示脚本正在启动
-
@MisterSmith 我同意这似乎是错误所暗示的。如何确定它是二进制文件还是指向其他内容的包装脚本? wget 返回
[application/octet-stream]的事实意味着它是一个二进制文件,不是吗? -
在典型的 Linux 开发人员机器上,
file命令通常会告诉您(或猜测)某个文件是什么类型的文件。您可能在容器中没有此工具,因为它更像是一种开发人员工具。curl为你解压文件并非不可能。
标签: linux docker amazon-ec2 gzip tar