0
votes

So I am building an image from a dockerfile, using the COPY command to copy a local file from host into my container. After the image is build I run an interactive shell, and test my file which I copied and am having an error.

Here is my shell information.

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

Here is my docker file

FROM ubuntu
MAINTAINER [email protected]
COPY software /bin

Note that under my directory where my Dockerfile is contained, I placed my "software" directory, which has a bedWiggle executable in the Dockerfile's context, so it does get loaded into my new container of which my image creates.

This shows the successful completion of the image

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

Yet I get the error when I enter the container built by the above image and running my executable

root@hhhlf75hhhhfcb87ccfa:/bin# ./bedWigggle ./bedWiggle: error while loading shared libraries: libkrb5.so.3: cannot open shared object file: No such file or directory

2

2 Answers

3
votes

The error tells you exactly what the problem is - you have copied over the executable, but it has dependencies on various libraries (including libkrb5.so.3) that aren't in the container.

You have two choices; you can add the dependencies to the container or you can recompile the executable so that it is statically linked.

You can run the ldd tool on the executable to discover which dependencies it requires. You can then either copy the libraries directly into the container as you did with the executable or (probably better) you can find which package the dependencies are from and install with apt-get.

0
votes

From the error, it appears that the shared library required by your executable (bedWiggle) is missing (libkrb5.so.3).

One way to resolve this issue is:

  1. Use "COPY" command inside Dockerfile to copy the shared libraries/dependencies inside the container. Example: COPY {local_path} {docker_path}
  2. Set the environment variable where shared libraries are searched for first before the standard set of directories. For instance for Linux based OS, LD_LIBRARY_PATH is used. Environment variables can be set via Docker's Environment replacement (ENV) Example: ENV LD_LIBRARY_PATH={docker_path}:$LD_LIBRARY_PATH

Other is to statically link your dependencies (language dependent).