はじめに
最近Dockerを使っていろんな言語でHelloWorldしてます。
RustをDocker経由でビルドするときに毎回
$ docker run --iroiro_option rust cargo build
>>> Updating registry `https://github.com/rust-lang/crates.io-index`
Updating registry ~~が実行されビルドに時間がかかっていたので、
ローカル(ホスト)にレジストリを作成してビルド時間を短縮しました。
結論
-vオプションでビルドするホスト側のプロジェクトと、
依存パッケージを格納するホストディレクトリの両方をボリュームに割り当てることで、
ローカルのレジストリを使用してビルドできます。
$ docker run --rm \
-v /path/to/your/project/:/usr/src/myapp \
-v /path/to/your/registrory:/usr/local/cargo/registry/ \
-w /usr/src/myapp \
rust:latest \
cargo build
開発環境
-
- macOS High Sierra 10.13.6
-
- Docker for Mac
Engine : 18.06.1-ce
Compose : 1.22.0
Rust : 1.28
結論までの道のり
1.まずは公式イメージをプルします。
$ docker pull rust
$ docker images
>>> REPOSITORY TAG IMAGE ID CREATED SIZE
>>> rust latest 156ba9bbcf99 5 days ago 1.6GB
2.コンテナを立ち上げプロジェクトの雛形を作成します。
$ docker run --rm \
-e USER=your_name \
-v $(pwd):/usr/src/myapp \
-w /usr/src/myapp \
rust:latest \
cargo new your_project_name --bin
note : -eオプションで環境変数にUSERを設定しないとコケるので注意。
コマンド実行後、ホストのカレントディレクトリ直下にyour_project_nameというプロジェクトが作成されます。
3.Cargo.tomlに依存パッケージを追記します。
[package]
name = "your_project_name"
version = "0.1.0"
authors = ["your_name"]
[dependencies]
rand = "0.4.3" # 追記
extern crate rand;
use rand::Rng;
fn main() {
let random_number = rand::thread_rng().gen_range(1,101);
println!("{} is generated!", random_number);
}
3.レジストリ保存用のホストディレクトリをバインドしてビルドします。
$ docker run --rm \
-v /path/to/your/project/:/usr/src/myapp \
-v /path/to/your/registrory:/usr/local/cargo/registry/ \
-w /usr/src/myapp \
rust:latest \
cargo build
>>> Updating registry `https://github.com/rust-lang/crates.io-index`
>>> Downloading rand v0.4.3
>>> Downloading libc v0.2.43
>>> Finished dev [unoptimized + debuginfo] target(s) in 5m 07s
2つ目の-vオプションを指定しホストディレクトリにレジストリの保存領域を確保してます。
rustのdocker公式イメージの場合、cargo管理下のレジストリは
/usr/local/cargo/registry/に配置されるようです。
初回は依存パッケージのダウンロードが行われますが、
次回以降、
$ docker run --rm \
-v /path/to/your/project/:/usr/src/myapp \
-v /path/to/your/registrory:/usr/local/cargo/registry/ \
-w /usr/src/myapp \
rust:latest \
cargo build
>>> Finished dev [unoptimized + debuginfo] target(s) in 0.03s
パッケージのダウンロードが行われずコンパイルのみが実行されます。
お疲れさまでした!!