🆙

Dockerで feature 'edition2024' is required エラーが出た

に公開

はじめに

docker compose upを叩いたら、特定のサービスだけビルドが通らなくなった!
この記事では、当時のトラブルシューティングの流れを備忘録がてらまとめておこうと思います。

「え、同じエラー出たかも…?」という人のヒントになればうれしいです🙏

発生したエラー

問題が起きたのは、開発環境の立ち上げ時。migrationというサービスのビルド中に、以下のようなエラーが発生してストップしてしまいました。

error: failed to compile `sqlx-cli v0.8.6` ...
Caused by:
  failed to parse manifest at `/usr/.../base64ct-1.8.0/Cargo.toml`

Caused by:
  feature `edition2024` is required

  The package requires the Cargo feature called `edition2024`, but that feature is not stabilized in this version of Cargo (1.82.0)

要点を整理すると:

  • cargo install sqlx-cliが失敗してる
  • base64ctという依存パッケージのCargo.tomlでエラー
  • 原因は「edition2024という機能が必要だけど、現在のCargoでは未対応」

原因:Rust/Cargoのバージョンが古かったぽい

どうやらこのエラー、Rustの2024 Edition(まだ安定してない新機能)を使っているパッケージを、古いCargoでビルドしようとしたために起きたようです。

対象のサービスは、下記のようなdocker-compose.ymlで定義されています。

  migration:
    image: hoge-sqlx-cli
    container_name: hoge-sqlx-cli
    build:
      context: sqlx-cli
    environment:
      DATABASE_URL: postgres://postgres:password@postgres:5432/hoge_db
    command: ["sqlx", "migrate", "run"]

そしてsqlx-cliディレクトリのDockerfileはこうなっていました👇

FROM rust:1.82.0

WORKDIR /app

RUN cargo install sqlx-cli --no-default-features --features rustls,postgres

ここで使っているrust:1.82.0のイメージが、edition2024に対応してなかったんですね。これが詰まりの原因でした。

解決策:Rustのバージョンを最新に更新するだけ

解決はめちゃシンプルでした。

# 修正後
FROM rust:latest

WORKDIR /app

RUN cargo install sqlx-cli --no-default-features --features rustls,postgres

rust:latestを指定することで、常に最新の安定版Rustでビルドされるようになります。

これで再度docker compose upを実行したところ、ビルド成功&環境立ち上げも問題なし🎉

ただ...バージョン固定 vs latest のトレードオフ

本番運用などでは、latestのようにバージョンを動的に追うスタイルはリスクもあります。想定外の変更が入って壊れる可能性があるからですね。

なので、以下のように特定バージョンを明示しておく方がチーム開発的には良いかもですね。

FROM rust:1.83.0

この場合は「定期的に手動でRustバージョンを見直す」という運用がセットになります。CIでビルド確認しつつアップデートタイミングをコントロールするのがおすすめです。

まとめ

というわけで、今回のまとめ👇

項目 内容
エラー feature 'edition2024' is required
原因 Docker内のRust/Cargoが古く、依存が要求する新機能に非対応
解決策 Dockerfileで使っているRustイメージを最新版に更新する

Rust界隈は進化が早く、依存パッケージが先に新機能に対応し始めるケースも珍しくありません。その意味では、「環境を固定しすぎない柔軟性」と「継続的なアップデート」がとても大事だな〜と実感しました😌


【追記】macOS (Apple Silicon) でのみ問題が発生した理由

後日、このビルドエラーはmacOS、特にApple Silicon (M1/M2/M3)搭載のマシンでのみ発生する事象であることがわかりました。LinuxやWindowsのマシンでは同じエラーが起きなかったのです。

この差異が生まれる主な原因は、CPUアーキテクチャの違い(aarch64 vs x86_64)にあると考えられます。

  1. DockerのビルドはホストのCPUアーキテクチャに依存する
    Apple Silicon搭載のMacでDockerイメージをビルドすると、ARM64 (aarch64) 版のイメージが作成されます。一方、Intel CPUのMacや多くのLinux/Windowsマシンでは、Intel/AMD (x86_64) 版のイメージが作成されます。

  2. アーキテクチャによって依存関係の解決が異なる場合がある
    RustのパッケージマネージャであるCargoは、cargo installcargo buildを実行する際に、ターゲットとなるCPUアーキテクチャに最適な依存パッケージをダウンロードします。

今回、x86_64アーキテクチャ向けに依存関係を解決した際にはedition2024を必要としない古いバージョンのパッケージが選択されたのに対し、aarch64向けに解決した際には edition2024を必要とする、より新しいバージョンのパッケージが選択された ものと推測されます。

つまり、macOS (Apple Silicon) 環境でビルドした際に、たまたま新しい依存パッケージが選択されたことで、根本的な原因であった「Rustバージョンの古さ」が表面化した、ということです。

Discussion