Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在基于busybox的Docker映像中使用动态链接?_Docker_Rust - Fatal编程技术网

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

如何在基于busybox的Docker映像中使用动态链接?,docker,rust,Docker,Rust,在我的Ubuntu机器上,我有一个http服务器Rust二进制文件动态链接到glibc(默认目标),我想把我的Rust应用程序放到Docker busybox基本映像中。在/usr/lib处将每个库复制到busybox中似乎不起作用,LD\u LIBRARY\u PATH在运行时似乎也不起作用。我需要在编译时将特殊选项传递给cargo吗 以下是我当前的设置: $ rustc --version rustc 1.7.0 (a5d1e7a59 2016-02-29) $ cargo --versio

在我的Ubuntu机器上,我有一个http服务器Rust二进制文件动态链接到glibc(默认目标),我想把我的Rust应用程序放到Docker busybox基本映像中。在
/usr/lib
处将每个库复制到busybox中似乎不起作用,
LD\u LIBRARY\u PATH
在运行时似乎也不起作用。我需要在编译时将特殊选项传递给cargo吗

以下是我当前的设置:

$ 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除外,它在运行时被注入到进程中):

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

/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应用程序的图像,我将尝试在容器中运行该应用程序:

/target/release$ docker run -d -p 3000:3000 --name my-rust-app my-rust-app
9aaf3c9b0e6d52511723382b5248da3c59397acca5f60637644ba311ec394d5e
查看docker日志,我看到服务器的输出:

/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应用程序,我可以启动服务器并将其成功卷曲:

/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二进制文件有什么问题?

您使用的是哪种版本的Rust?最近关于RPATH的使用发生了一些变化,这些变化在这里可能有帮助,也可能有阻碍。@MatthieuM。增加了rustc和cargo版本号。谢谢你的邀请!1.7.0正是激活使用的版本,但是根据,它不应该优先于LD_LIBRARY_PATH::我想也许我只是不明白动态链接是如何工作的。我应该在编译时禁用或更改RPATH以使用我的容器吗?如果您的应用程序在docker内部启动,就我所知,问题不在于动态加载。您使用的是哪个版本的Rust?最近关于RPATH的使用发生了一些变化,这些变化在这里可能有帮助,也可能有阻碍。@MatthieuM。增加了rustc和cargo版本号。谢谢你的邀请!1.7.0正是激活使用的版本,但是根据,它不应该优先于LD_LIBRARY_PATH::我想也许我只是不明白动态链接是如何工作的。我应该在编译时禁用或更改RPATH以使用我的容器吗?如果您的应用程序在docker内部启动,就我所知,问题不在于动态加载。
/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"}