如何在基于busybox的Docker镜像中使用动态链接?

时间:2016-03-07 04:51:03

标签: docker rust

在我的Ubuntu机器上,我有一个与glibc(默认目标)动态链接的http服务器Rust二进制文件,我想将 my-rust-app 放入Docker busybox基本映像。将每个库复制到/usr/lib的busybox似乎不起作用,LD_LIBRARY_PATH似乎也无法在运行时运行。我是否需要在编译时将特殊选项传递给货物?

这是我目前的设置:

$ rustc --version
rustc 1.7.0 (a5d1e7a59 2016-02-29)
$ cargo --version
cargo 0.8.0-nightly (28a0cbb 2016-01-17)

更新1:

构建过程和我的链接库:

/$ cargo build --release
/$ cd target/release
/target/release$ mkdir so
/target/release$ ldd my-rust-app
    linux-vdso.so.1 =>  (0x00007fffc0b97000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1f270d7000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1f26eb9000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f1f26ca3000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1f268de000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f1f27686000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1f265d8000)

我复制了每个(除了 linux-vdso.so ,它在运行时注入到进程中):

/target/release$ mkdir so
/target/release$ cp /lib/x86_64-linux-gnu/libdl.so.2 so/
/target/release$ cp /lib/x86_64-linux-gnu/libpthread.so.0 so/
/target/release$ cp /lib/x86_64-linux-gnu/libgcc_s.so.1 so/
/target/release$ cp /lib/x86_64-linux-gnu/libc.so.6 so/
/target/release$ cp /lib/x86_64-linux-gnu/libm.so.6 so/

我的Dockerfile使用busybox标记处的glibc图片:

/target/release$ cat Dockerfile 
FROM busybox:glibc
EXPOSE 3000
WORKDIR /usr/bin
COPY my-rust-app .
COPY so/ /usr/lib
ENV LD_LIBRARY_PATH="/usr/lib"
ENTRYPOINT ["/usr/bin/my-rust-app"]

构建 my-rust-app 图像后,我尝试在容器中运行该应用程序:

/target/release$ docker run -d -p 3000:3000 --name my-rust-app my-rust-app
9aaf3c9b0e6d52511723382b5248da3c59397acca5f60637644ba311ec394d5e

查看docker logs,我看到服务器的输出:

/target/release$ docker logs my-rust-app
Listening on port 3000

但是,我无法卷曲端点:

/target/release$ curl http://127.0.0.1:3000/
curl: (56) Recv failure: Connection reset by peer

如果我尝试在我的Ubuntu主机中直接运行相同的 my-rust-app ,我可以启动服务器并成功卷曲:

/target/release$ ./my-rust-app &
[1] 6131
Listening on port 3000

/target/release$ curl http://127.0.0.1:3000/health
Got request for /health
{"status":"ok"}

我的容器或Rust二进制文件出了什么问题?

0 个答案:

没有答案