linux - Docker-/bin/sh : <file> not found - bad ELF interpreter - how to add 32bit lib support to a docker image

标签 linux unix docker dockerfile

更新 – 旧问题标题:
Docker - 如何在 docker 构建期间执行解压缩/解压/提取的二进制文件(将文件添加到 docker 构建上下文)

--

我一直在尝试(半天:P)执行在 docker 构建期间提取的二进制文件。

我的 dockerfile 大致包含:

...
COPY setup /tmp/setup
RUN \
unzip -q /tmp/setup/x/y.zip -d /tmp/setup/a/b
...

目录b内是一个二进制文件imcl

我遇到的错误是:

/bin/sh: 1: /tmp/setup/a/b/imcl: not found

令人困惑的是,在尝试执行二进制文件之前显示目录 b (在构建期间的 dockerfile 内),显示了正确的文件:

RUN ls -la /tmp/setup/a/b/imcl  
-rwxr-xr-x  1 root root 63050 Aug  9  2012 imcl

RUN file /tmp/setup/a/b/imcl  
ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped` 

作为一个 Unix 菜鸟,一开始我以为这是一个权限问题(主机的根目录与容器的根目录不同),但是经过检查,两者的 UID 都是 0,所以它变得更加奇怪。

Docker 询问 not to use sudo 所以我尝试使用 su 组合:

su - -c "/tmp/setup/a/b/imcl"
su - root -c "/tmp/setup/a/b/imcl"

这两个都返回:

stdin: is not a tty
-su: /tmp/setup/a/b: No such file or directory

好吧,我什至违背了 Docker 的建议,并将我的基本镜像从 debian:jessie 更改为 bloatish ubuntu:14.04 所以我可以尝试使用 sudo :D

猜猜结果如何?

sudo: unable to execute /tmp/setup/a/b/imcl: No such file or directory

随机谷歌搜索我偶然发现了一个piece of Docker docs我相信这就是所有这些猛烈抨击的原因: “注意:如果上传的上下文中不存在该文件或目录,docker build 将返回“无此类文件或目录”错误。如果没有上下文,或者您指定了位于其他位置的文件,则可能会发生这种情况。主机系统。出于安全原因,上下文仅限于当前目录(及其子目录),并确保在远程 Docker 主机上可重复构建。这也是 ADD ../file 不起作用的原因。”

所以我的问题是:

  • 有解决方法吗?
  • 有没有办法在构建期间(在 dockerfile 内)将提取的文件添加到 docker 构建上下文?

哦,我正在构建的机器没有连接到互联网......

我想我要问的与此类似(尽管我没有看到答案):
How to include files outside of Docker's build context?

那我运气不好吗?

在将构建上下文发送到 Docker 守护进程之前,我是否需要使用 shell 脚本解压缩,以便所有文件都按照构建命令期间的方式使用?

更新:
嗯,构建上下文实际上不是问题。我对此进行了测试,并且能够在 docker 构建期间执行解压的二进制文件。

我的问题实际上是这个: CentOS 64 bit bad ELF interpreter

使用 debian:jessie 和 ubuntu:14.04 作为基础镜像只会给出 No such file or directory 错误,但尝试使用 centos:7 和 fedora:23 会给出更好的错误消息:

/bin/sh: /tmp/setup/a/b/imcl: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

因此我得出的结论是,这实际上是在 64 位系统上运行 32 位应用程序的问题。

现在,如果我能够访问互联网并启用存储库,解决方案就会很简单:

apt-get install ia32-libs

或者

yum install glibc.i686

但是,我不...:[

所以现在的问题是:

  • 在没有存储库或互联网连接的情况下实现相同结果的最佳方法是什么?

根据IBM ,我需要的精确库是 gtk2.i686 和 libXtst.i686 以及可能的 libstdc++

[root@localhost]# yum install gtk2.i686
[root@localhost]# yum install libXtst.i686
[root@localhost]# yum install compat-libstdc++

最佳答案

UPDATE:

So the question becomes now:

  • What would be the best way to achive the same result without repos or internet connection?

您可以使用 DockerHub 上提供的各种非官方 32 位镜像,搜索 debian32ubuntu32fedora32 等。

如果你不相信他们,你可以自己构建这样的镜像,你也可以在 DockerHub 上找到说明,例如:


或者,您可以根据一些官方镜像准备自己的镜像并向其中添加 32 位包。

比如说,您可以像这样使用 Dockerfile:

FROM debian:wheezy
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update
RUN apt-get install -y ia32-libs

...并使用生成的图像作为您在没有互联网访问的情况下构建的图像的基础(使用 FROM 指令)。

您甚至可以创建 automated build在 DockerHub 上,当您的 Dockerfile(发布在 GitHub 上)或主线镜像(上例中的 debian)发生更改时,它将自动重建您的镜像。


无论您如何获取支持 32 位的镜像(使用现有的非官方镜像或构建自己的镜像),您都可以使用 docker save 命令将其存储到 tar 存档中,并然后使用 docker load 命令导入。

关于linux - Docker-/bin/sh : <file> not found - bad ELF interpreter - how to add 32bit lib support to a docker image,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34777195/

相关文章:

linux - 如何根据片段长度对床文件进行子集化?

java - 这个值 "20150716203621.000Z"的时间格式的技术术语是什么?

go - 如何在go中检查文件是否可执行?

docker - 如何清理 Docker 容器日志?

docker - docker build 上的 yarn 警告

linux - node.js:找不到模块 'request'

python - 在 linux 上从另一个 python 脚本运行 python 脚本

docker - 映射Bluemix容器上的暴露端口

linux - 解决断开的符号链接(symbolic link)

linux - 如何在回声中传递较旧的日期?