CONTENTS
ENVIRONMENTS
- debian: buster
- distroless/static-debian10
- rust: 1.51.0 (2fd73fabe 2021-03-23)
なんでそんなことをするのか
distroless を使えば OS のセキュリティパッチを追いかけなくていいので、distroless イメージにバイナリをコピーするだけにしたい。
rustup でターゲットを追加
distroless にバイナリをコピーするだけで動くようにするには、x86_64-unknown-linux-musl
をターゲットにする必要がある。
そのために rustup でターゲットを追加する。
rustup target add x86_64-unknown-linux-musl
これで x86_64-unknown-linux-musl
をターゲットにしてコンパイルできるようになる。
musl コンパイラをインストール
actix-web をコンパイルしようとしたら、musl のコンパイラがない、と文句を言われた。 musl-tools をインストールすることで解消できる。
apt-get update apt-get install -y musl-tools
ビルド
準備が整ったら cargo build するだけ。
cargo build --release --target x86_64-unknown-linux-musl # => target/x86_64-unknown-linux-musl/release/{BIN}
target を指定するとそのターゲット名のディレクトリにバイナリが生成される。
まとめ
distroless イメージ上で動かすためのビルドの仕方をまとめた。 参考にした記事では「静的リンク」と言っていたのだけど、検索ではほとんどヒットしなかったので備忘録としてまとめた。
ただ、musl でビルドするために追加でツールが必要だったので、他にも対応しなければならないことがありそう。
あと mac で開発することにしたので開発時のターゲットと本番用のターゲットが全然違うものになる。 できれば同じような環境にしたいところだけれど、とりあえずこれでやってみる。