在我的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二进制文件出了什么问题?