8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Docker経由でCargo buildするときにローカルのレジストリ情報を使う。

Posted at

##はじめに
最近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に依存パッケージを追記します。

Cargo.toml
[package]
name = "your_project_name"
version = "0.1.0"
authors = ["your_name"]

[dependencies]
rand = "0.4.3" # 追記
main.rs
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

パッケージのダウンロードが行われずコンパイルのみが実行されます。
お疲れさまでした!!

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?