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
)にあると考えられます。
-
DockerのビルドはホストのCPUアーキテクチャに依存する
Apple Silicon搭載のMacでDockerイメージをビルドすると、ARM64 (aarch64
) 版のイメージが作成されます。一方、Intel CPUのMacや多くのLinux/Windowsマシンでは、Intel/AMD (x86_64
) 版のイメージが作成されます。 -
アーキテクチャによって依存関係の解決が異なる場合がある
RustのパッケージマネージャであるCargoは、cargo install
やcargo build
を実行する際に、ターゲットとなるCPUアーキテクチャに最適な依存パッケージをダウンロードします。
今回、x86_64
アーキテクチャ向けに依存関係を解決した際にはedition2024
を必要としない古いバージョンのパッケージが選択されたのに対し、aarch64
向けに解決した際には edition2024
を必要とする、より新しいバージョンのパッケージが選択された ものと推測されます。
つまり、macOS (Apple Silicon) 環境でビルドした際に、たまたま新しい依存パッケージが選択されたことで、根本的な原因であった「Rustバージョンの古さ」が表面化した、ということです。
Discussion