容器 "error when loading shared libraries" DOCKER 中的错误 运行 文件

Error running file in Container "error when loading shared libraries" DOCKER

所以我正在从 docker 文件构建图像,使用 COPY 命令将本地文件从主机复制到我的容器中。构建图像后,我 运行 一个交互式 shell,并测试我复制的文件,但出现错误。

这是我的 shell 信息。

arcolombo@arcolombo:~/Documents/bedgraph_dockerfile$ sudo docker info
Containers: 18
Images: 72
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Dirs: 108
Execution Driver: native-0.2
Kernel Version: 3.16.0-33-generic
Username: arcolombo
Registry: [https://index.docker.io/v1/]
WARNING: No swap limit support

这是我的 docker 文件

FROM ubuntu
MAINTAINER anthonycolombo60@gmail.com
COPY software /bin

请注意,在包含我的 Dockerfile 的目录下,我放置了我的 "software" 目录,该目录在 Dockerfile 的上下文中有一个 bedWiggle 可执行文件,因此它确实被加载到我的图像创建的新容器中.

这表示图片制作成功

arcolombo@arcolombo:~/Documents/bed_dockerfile$ sudo docker build        -t="arcolombo" .
Sending build context to Docker daemon   2.7 MB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu
---> d0955f21bf24
Step 1 : MAINTAINER anthonycolombo60@gmail.com
  ---> Using cache
  ---> 5el36a81f34
     Step 2 : COPY software /bin
 ---> Using cache
 ---> 1llhh2e278683ea
Successfully built 1hhfjjeea

然而,当我进入由上图构建的容器并运行我的可执行文件

时,我得到了错误

root@hhhlf75hhhhfcb87ccfa:/bin# ./bedWiggle ./bedWiggle:加载共享库时出错:libkrb5.so.3:无法打开共享对象文件:没有这样的文件或目录

该错误告诉您确切的问题所在 - 您已经复制了可执行文件,但它依赖于不在容器中的各种库(包括 libkrb5.so.3)。

你有两个选择;您可以将依赖项添加到容器中,也可以重新编译可执行文件以使其静态链接。

您可以 运行 可执行文件上的 ldd 工具来发现它需要哪些依赖项。然后,您可以像处理可执行文件一样将库直接复制到容器中,或者(可能更好)您可以找到依赖项来自哪个包并使用 apt-get.

安装

从错误来看,您的可执行文件 (bedWiggle) 所需的共享库似乎丢失 (libkrb5.so.3)。

解决此问题的一种方法是:

  1. 在 Dockerfile 中使用 "COPY" 命令将共享的 libraries/dependencies 复制到容器中。 示例:复制 {local_path} {docker_path}
  2. 设置在标准目录集之前首先搜索共享库的环境变量。例如,对于基于 Linux 的 OS,使用 LD_LIBRARY_PATH。可以通过 Docker's Environment replacement (ENV) 设置环境变量 示例:ENV LD_LIBRARY_PATH={docker_path}:$LD_LIBRARY_PATH

其他是静态地 link 你的依赖项(依赖于语言)。