我有一个简单的火箭 0.5.0-dev 应用程序
main.rs
#[macro_use] extern crate rocket;
use rocket::http::{Status};
use rocket::State;
use std::sync::{Mutex, Arc};
struct Event {}
#[get("/health")]
fn health() -> Result<&'static str, Status> {
Ok("UP")
}
#[launch]
fn rocket() -> rocket::Rocket {
rocket::ignite()
.manage(Arc::new(Mutex::new(Vec::<Event>::new())))
.mount("/", routes![health])
}
货运.toml
[package]
name = "minimal-example"
version = "0.1.0"
authors = ["Author <author@example.com>"]
edition = "2018"
[dependencies]
rocket = { git = "https://github.com/SergioBenitez/Rocket" }
rocket_contrib = { git = "https://github.com/SergioBenitez/Rocket" }
chrono = { version = "0.4.19", features = ["serde"] }
serde = { version = "1.0.117", features = ["derive"] }
serde_json = "1.0.59"
rand = "0.7.3"
在我的开发机器(cygwin 中的 rustc 1.47.0 (18bf6b4f0 2020-10-07))上,我可以编译运行这个程序,x86_64-pc-windows-gnu 目标没有问题。
我的 CI 为 x86_64-unknown-linux-musl 构建了这个程序,并将其打包到一个容器中。
Dockerfile
FROM docker-registry.default.svc:5000/build/rhel:8
USER 0
COPY . /build
RUN microdnf -y install gcc \
&& curl https://sh.rustup.rs -sSf | bash -s -- -y \
&& source $HOME/.cargo/env \
&& rustup target add x86_64-unknown-linux-musl \
&& cd /build \
&& cargo build --release --target x86_64-unknown-linux-musl
RUN ls -lh /build/target/release
FROM scratch
USER 0
EXPOSE 8080
ENV ROCKET_PORT 8080
WORKDIR /app
COPY --from=0 /build/target/x86_64-unknown-linux-musl/release/myapp .
RUN ls -lh /app
ENTRYPOINT ["/app/myapp"]
但是,一旦我将此图像部署到 OSCP,我就得到了……什么都没有。该程序只是无限期挂起。我将应用程序从容器中复制出来,并尝试在 Linux 服务器(SMP Debian 4.9.30-2 (2017-06-12) x86_64 GNU/Linux)上运行它,结果相同。我跑了 strace 给了我
epoll_ctl(3, EPOLL_CTL_ADD, 6, {EPOLLIN|EPOLLPRI|EPOLLOUT|EPOLLET, {u32=0, u64=0}}) = 0
brk(0x564de1356000) = 0x564de1356000
socketpair(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0, [7, 8]) = 0
brk(0x564de1357000) = 0x564de1357000
rt_sigaction(SIGINT, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGINT, {sa_handler=0x564de08a8b10, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO|SA_NOCLDSTOP, sa_restorer=0x564de08f5716}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
fcntl(7, F_DUPFD_CLOEXEC, 0) = 9
fcntl(9, F_SETFD, FD_CLOEXEC) = 0
epoll_ctl(3, EPOLL_CTL_ADD, 9, {EPOLLIN|EPOLLPRI|EPOLLOUT|EPOLLET, {u32=1, u64=1}}) = 0
getsockname(6, {sa_family=AF_INET, sin_port=htons(8000), sin_addr=inet_addr("127.0.0.1")}, [128->16]) = 0
futex(0x7ffe331e9284, FUTEX_WAIT_PRIVATE, 2, NULL
似乎应用程序在等待 futex 时死锁,我只是不知道为什么(以及为什么它不会在 Windows 上发生)。我已经尝试使用 x86_64-unknown-linux-gnu 进行编译并切换到系统分配器,但均无济于事。