因此,我使用COPY命令从dockerfile构建映像,将本地文件从主机复制到我的容器中。生成映像后,我运行一个交互式外壳,并测试我复制的文件并出现错误。
这是我的外壳信息。
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 [email protected]
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 [email protected]
---> Using cache
---> 5el36a81f34
Step 2 : COPY software /bin
---> Using cache
---> 1llhh2e278683ea
Successfully built 1hhfjjeea
但是,当我输入由以上图像构建的容器并运行我的可执行文件时,出现错误
root @ hhhlf75hhhhfcb87ccfa:/ bin#./bedWigggle./bedWiggle:加载共享库时出错:libkrb5.so.3:无法打开共享库文件:无此类文件或目录
该错误告诉您确切的问题是-您已复制了可执行文件,但它依赖于容器中没有的各种库(包括libkrb5.so.3
)。
您有两种选择;您可以将依赖项添加到容器中,也可以重新编译可执行文件以使其静态链接。
您可以在可执行文件上运行ldd
工具,以发现它需要哪些依赖项。然后,您可以像执行可执行文件一样将库直接复制到容器中,或者(可能更好),您可以找到依赖项来自哪个包并使用apt-get
安装。
从该错误看来,您的可执行文件(bedWiggle)所需的共享库丢失了(libkrb5.so.3)。
解决此问题的一种方法是:
其他是静态链接您的依赖项(取决于语言)。