2

シンプルなロケット 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 でコンパイルし、システム アロケータに切り替えようとしましたが、どちらも役に立ちませんでした。

4

0 に答える 0