Почему rustc не включил libmariadb в релизный бинарник?

Я думал, что компилятор ржавчины использует статическую привязку и включает все зависимые библиотеки во время компиляции (отсюда размер исполняемого файла).

Но когда я попытался использовать скомпилированный двоичный файл в рабочем образе докера с actix, клиентом mysql и дизельным двигателем с включенной функцией mysql, появляется эта ошибка:

error while loading shared libraries: libmariadb.so.3: cannot open shared object file: No such file or director

Мой докерфайл:

FROM rust:1.43 as builder
WORKDIR /var/app

RUN apt-get update && apt-get install -y libclang-dev clang libmariadb-dev-compat libmariadb-dev

COPY Cargo.toml Cargo.lock diesel.toml ./
COPY src src

RUN cargo install diesel_cli --no-default-features --features mysql
RUN cp /usr/local/cargo/bin/diesel diesel
RUN cargo build --release

FROM ubuntu
USER 1000
WORKDIR /var/app

COPY --from=builder --chown=1000:1000 /var/app/target/release/sniper_api app
COPY --from=builder --chown=1000:1000 /var/app/diesel diesel

CMD ["./app"]

Мой груз:

[dependencies]
actix-rt = "1.0.0"
actix-web = "2.0.0"
actix-http = "1.0.1"
serde = { version = "1.0.112", features=["derive"] }
dotenv = "0.15.0"
config = "0.10.1"
diesel = { version = "1.4.2", features = ["mysql","r2d2"]}
futures = "0.3.5"
r2d2 = "0.8.8"
r2d2_mysql = "18.0.0"
env_logger = "0.7.1"

Но если я использую ubuntu/debian/etc. изображение как время выполнения и установить libmariadb-dev-compat libmariadb-dev все в порядке. Есть ли способ получить настоящий одиночный двоичный файл с соединителем mysql в Rust?


person Alex Smith    schedule 15.06.2020    source источник


Ответы (1)


Я думал, что компилятор ржавчины использует статическую привязку и включает все зависимые библиотеки во время компиляции (отсюда размер исполняемого файла).

Это относится только к библиотекам Rust. Для других языков, как правило, rustc мало что может сделать.

В частности, в этом случае diesel обеспечивает поддержку mysql/mariadb через крейт mysqlclient-sys, для которого в настоящее время существует проблема и сопутствующий PR, открытый для поддержки статической компоновки для этой библиотеки. Но они еще не объединены.

person mcarton    schedule 15.06.2020
comment
Склонна ли ржавчина к этим проблемам по всем направлениям или это происходит только с некоторыми библиотеками, например, с коннекторами mysql? Я пытаюсь разобраться в этом, и мне кажется, что postgres и sqlite будут в порядке. Но хочу убедиться. - person Alex Smith; 17.06.2020
comment
Некоторые библиотеки C или C++ предпочитают либо статическую, либо динамическую компоновку, а некоторые системы упрощают использование динамических библиотек, но не статических библиотек. - person mcarton; 17.06.2020