LoginSignup
1
0

【Rust】Docker+Alpine で error: cannot produce ... `x86_64-unknown-linux-musl` does not support these crate types

Last updated at Posted at 2022-04-11

Rust 言語のソースを、Rust の Alpine ベースイメージ(rust:alpine)を使って Docker でビルドすると、error: cannot produce ... as the target `x86_64-unknown-linux-musl` does not support these crate types エラーが出る。

# cargo build --release
error: cannot produce cdylib for `block-access v0.1.0 (/feather/quill/example-plugins/block-access)` as the target `x86_64-unknown-linux-musl` does not support these crate types

「rust cargo docker alpine error: cannot produce x86_64-unknown-linux-musl does not support these crate types」でググっても Alpine 以外のイメージを使う情報しかなかったので、自分のググラビリティとして。

TL; DR (今北産業)

  1. 「C ライブラリのリンクに失敗した」というメッセージ
    • Alpine Linux はシステムの C ランタイム/標準 C ライブラリに、一般的な glibc などの代わりに musl を利用しています。そのため x86_64-unknown-linux-musl がターゲットとして使われるも、musl-devcdylib(C 互換の動的ライブラリ)の作成に対応していないためエラーになります(この例では block-access が作ろうとしている)
  2. ビルド時、環境変数 RUSTFLAGS に "-C target-feature=-crt-static" をセットする
    • 例) RUSTFLAGS="-C target-feature=-crt-static" cargo build --release
  3. -crt-static(マイナス付き)を指定すると、クレート作成時に C ランタイムを埋め込まない(システムの C ライブラリを埋め込んだ動的ライブラリを作成しない)設定になる

この設定は、標準 C ライブラリ(もしくは互換のある多言語ライブラリ)を rust で利用する場合には有効ですが、すべてのエラーにおいて有効というわけではありません。

動作サンプル

FROM rust:alpine

WORKDIR /workspace

# Alpine でコンパイルならとりま入れておけパック
# (make、musl-dev や libc-dev なども入る)
RUN apk add --no-cache \
    alpine-sdk \
    build-base

# アプリが依存するライブラリをインストール
RUN apk add --no-cache \
    cmake \
    openssl-dev \
    xcb-util-dev \
    python3-dev \
    fontconfig-dev

# アプリのソースと依存パッケージのダウンロード
RUN \
    git clone https://github.com/iceiix/stevenarella.git && \
    cd stevenarella && \
    cargo fetch

# メインパッケージのビルド
RUN \
    RUSTFLAGS="-C target-feature=-crt-static" cargo build --release

参考文献

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0