Rust のクロスコンパイルツール cross を使って Linux で windows 向けにクロスコンパイルする。
Docker関連でエラーがでたので対処法。
環境
Docker version 19.03.4-ce, build 9013bf583a
cross 0.1.16
cargo 1.37.0 (9edd08916 2019-08-02)
Arch Linux
やったこと
$ cargo install cross
$ sudo systemctl start docker
$ cross build --release --target x86_64-pc-windows-gnu
エラー
Dockerのバージョンが取得できないようです。
thread 'main' panicked at 'Unable to obtain Docker version: Error(Msg("`\"docker\" \"version\" \"--format={{.Server.APIVersion}}\"` failed with exit code: Some(1)"), State { next_error: None, backtrace: InternalBacktrace { backtrace: None } })', src/libcore/result.rs:999:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
issueがあがっていました。
といってもバグではありません。
https://github.com/rust-embedded/cross/issues/185
単にroot権限がないから実行できないようです。
Linux の場合、 Docker コマンドを実行するには root 権限が必要であるために発生しています。
( rootless docker がすでにリリースされているようなので、今後はセキュリティ的にもそちらを使うほうがいいみたいです。)
こうする
cross
を実行するユーザーが root 権限なしで docker コマンドを実行できるようにすればよいようです。
Docker のドキュメントに従います。
Manage Docker as a non-root user
# docker ユーザーがない場合はつくる
$ sudo groupadd docker
# docker グループにログインユーザーを追加する
$ sudo usermod -aG docker $USER
# 設定を有効化する
$ newgrp docker
これで問題なくビルドすることができ、windows での動作も確認できました。
参考