rustを動かしてみる
テンプレあった 。
FROM rust:1.31
WORKDIR /usr/src/myapp
COPY . .
RUN cargo install --path .
CMD ["myapp"]
これでいける!!
❯ docker build -t my-rust-app . Sending build context to Docker daemon 38.4kB Step 1/5 : FROM rust:1.31 1.31: Pulling from library/rust cd8eada9c7bb: Pull complete c2677faec825: Pull complete fcce419a96b1: Pull complete 045b51e26e75: Pull complete 3b969ad6f147: Pull complete 2074c6bfed7d: Pull complete Digest: sha256:e2c4e3751290e30c3f130ef3513c7999aee87b5e7ac91e2fc9f3addcdf1f1387 Status: Downloaded newer image for rust:1.31 ---> 6f61eb35ad91 Step 2/5 : WORKDIR /usr/src/myapp ---> Running in 95da21250478 Removing intermediate container 95da21250478 ---> 30baffbb7ef5 Step 3/5 : COPY . . ---> 1fa37b80b9c8 Step 4/5 : RUN cargo install --path . ---> Running in 8525c7bd068f error: `/usr/src/myapp` is not a crate root; specify a crate to install from crates.io, or use --path or --git to specify an alternate source Caused by: failed to read `/usr/src/myapp/Cargo.toml` Caused by: No such file or directory (os error 2) The command '/bin/sh -c cargo install --path .' returned a non-zero code: 101
いけない。そういうもんだよね。。
cargoはいってないんじゃね?? cargo -vあるかな??
❯ docker build -t my-rust-app . Sending build context to Docker daemon 38.4kB Step 1/6 : FROM rust:1.31 ---> 6f61eb35ad91 Step 2/6 : WORKDIR /usr/src/myapp ---> Using cache ---> 30baffbb7ef5 Step 3/6 : COPY . . ---> 15a7e974ab07 Step 4/6 : RUN cargo -v ---> Running in 647ee25bda4d Rust's package manager USAGE: cargo [OPTIONS] [SUBCOMMAND] OPTIONS: -V, --version Print version info and exit --list List installed commands --explain <CODE> Run `rustc --explain CODE` -v, --verbose Use verbose output (-vv very verbose/build.rs output) -q, --quiet No output printed to stdout --color <WHEN> Coloring: auto, always, never --frozen Require Cargo.lock and cache are up to date --locked Require Cargo.lock is up to date -Z <FLAG>... Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details -h, --help Prints help information Some common cargo commands are (see all commands with --list): build Compile the current package check Analyze the current package and report errors, but don't build object files clean Remove the target directory doc Build this package's and its dependencies' documentation new Create a new cargo package init Create a new cargo package in an existing directory run Build and execute src/main.rs test Run the tests bench Run the benchmarks update Update dependencies listed in Cargo.lock search Search registry for crates publish Package and upload this package to the registry install Install a Rust binary uninstall Uninstall a Rust binary See 'cargo help <command>' for more information on a specific command. Removing intermediate container 647ee25bda4d ---> 620da2e768fd Step 5/6 : RUN cargo install --path . ---> Running in 8f8b93d706b9
error: `/usr/src/myapp` is not a crate root; specify a crate to install from crates.io, or use --path or --git to specify an alternate source
Caused by:
failed to read `/usr/src/myapp/Cargo.toml`
Caused by:
No such file or directory (os error 2)
The command '/bin/sh -c cargo install --path .' returned a non-zero code: 101
あるね。。
あ。。
Caused by:
failed to read `/usr/src/myapp/Cargo.toml`
tomlがないのね なにそれ
バージョン管理ね https://doc.rust-lang.org/cargo/reference/manifest.html
バージョン管理してるんなら、yarnと一緒でしょ。。init あるでしょ
あるね https://doc.rust-lang.org/cargo/commands/cargo-init.html
❯ docker build -t my-rust-app .
Sending build context to Docker daemon 38.4kB
Step 1/6 : FROM rust:1.31
---> 6f61eb35ad91
Step 2/6 : WORKDIR /usr/src/myapp
---> Using cache
---> 30baffbb7ef5
Step 3/6 : COPY . .
---> b7d4d7c16e47
Step 4/6 : RUN cargo init .
---> Running in ffbb8b5eab1f
error: Failed to create package `myapp` at `/usr/src/myapp/.`
Caused by:
could not determine the current user, please set $USER
環境変数$USERがないと。。
たしかに、必要って書いてる https://doc.rust-lang.org/cargo/commands/cargo-init.html
こうやるのね https://stackoverflow.com/a/39598751/10677105
FROM rust:1.31
WORKDIR /usr/src/myapp
COPY . .
ENV USER=kajiri
RUN cargo init .
RUN cargo install --path .
CMD ["myapp"]
どうかな
❯ docker build -t my-rust-app .
Sending build context to Docker daemon 38.4kB
Step 1/7 : FROM rust:1.31
---> 6f61eb35ad91
Step 2/7 : WORKDIR /usr/src/myapp
---> Using cache
---> 30baffbb7ef5
Step 3/7 : COPY . .
---> d7f0b4278700
Step 4/7 : ENV USER=kajiri
---> Running in 22ae35b3cf8f
Removing intermediate container 22ae35b3cf8f
---> 3b4ac5598407
Step 5/7 : RUN cargo init .
---> Running in 9ade025832d9
Created binary (application) package
Removing intermediate container 9ade025832d9
---> eff329512744
Step 6/7 : RUN cargo install --path .
---> Running in 3126b73d74da
Installing myapp v0.1.0 (/usr/src/myapp)
Compiling myapp v0.1.0 (/usr/src/myapp)
Finished release [optimized] target(s) in 0.27s
Installing /usr/local/cargo/bin/myapp
Removing intermediate container 3126b73d74da
---> 1d6783aca4b4
Step 7/7 : CMD ["myapp"]
---> Running in e9a028782a23
Removing intermediate container e9a028782a23
---> 68991ec53954
Successfully built 68991ec53954
Successfully tagged my-rust-app:latest
よさそう ご飯たべるのわすれてたよ
❯ docker run -it --rm --name my-running-app my-rust-app
Hello, world!
うごいたうごいた
これだと、dockerにはいって頑張るしかないなめんどい
composeにしよう
"????? だぶるーくぉーてーしょんね http://www.eonet.ne.jp/~usakuma/hptec/hp_tec/hptec_style_41.htm
だぶるくぉーてーしょんにした
いろいろコピペしてきた 動くかな
❯ dcu -d
Starting docker_rust_1 ... done
root@LAPTOP-172317KL ~/ghq/github.com/kajirikajiri/rustBook/docker master*
❯ dp
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
846d3a4d2537 docker_rust "bash" About a minute ago Up 4 seconds 0.0.0.0:8999->80/tcp docker_rust_1
root@LAPTOP-172317KL ~/ghq/github.com/kajirikajiri/rustBook/docker master*
❯ dexec docker_rust_1 bash
root@846d3a4d2537:/src# exit
root@LAPTOP-172317KL ~/ghq/github.com/kajirikajiri/rustBook/docker master* 28s
❯ code .
root@LAPTOP-172317KL ~/ghq/github.com/kajirikajiri/rustBook/docker master*
❯ dexec docker_rust_1 bash
root@846d3a4d2537:/src# cargo init
Created binary (application) package
root@846d3a4d2537:/src# ls
Cargo.toml docker src
root@846d3a4d2537:/src# vi
bash: vi: command not found
root@846d3a4d2537:/src# ls src
main.rs
root@846d3a4d2537:/src# cat src/main.rs
fn main() {
let a = 5;
let b = 10;
println!("{} + {} = {}です。", a, b, a + b);
}root@846d3a4d2537:/src# cargo run
Compiling src v0.1.0 (/src)
error: unknown start of token: \u{3002}
--> src/main.rs:4:32
|
4 | println!("{} + {} = {}です。", a, b, a + b);
| ^^
|
help: Unicode character '。' (Ideographic Full Stop) looks like '.' (Period), but it is not
|
4 | println!("{} + {} = {}です.", a, b, a + b);
| ^
error: expected token: `,`
--> src/main.rs:4:17
|
4 | println!("{} + {} = {}です。", a, b, a + b);
| ^ expected `,`
error: aborting due to 2 previous errors
error: could not compile `src`.
はい、ダブルクォーテーションね
root@846d3a4d2537:/src# cargo run
Compiling src v0.1.0 (/src)
Finished dev [unoptimized + debuginfo] target(s) in 0.17s
Running `target/debug/src`
5 + 10 = 15です。
うごいたうごいた
さんぷるをやっていこう
いろいろやれそう https://doc.rust-lang.org/book/ch00-00-introduction.html
rust language server いれよう https://marketplace.visualstudio.com/items?itemName=rust-lang.rust
rustupないっていうな https://github.com/rust-lang/rls-vscode/issues/585 あと、どっかにでふぉはnightlyだから、stableにしろってかいてた。
{
"rust-client.useWSL": true,
"rust-client.revealOutputChannelOn": "info",
"rust-client.rustupPath": "~/.cargo/bin/rustup",
"rust-client.channel": "stable"
}
うごかないのな
root@846d3a4d2537:/src# which rustup
/usr/local/cargo/bin/rustup
あ、rust入れたのwslの中のdocker内部だけだから、wslにインストールしないといけない。いれよう https://www.rust-lang.org/tools/install
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustupないって。。
https://github.com/rust-lang/rls-vscode/issues/237#issuecomment-478299249 なるほど、
vscodeを終了する
rustup update
cargo clean
cargo check && cargo build
うごいたうごいた
shift + alt + noneはキー配列いじった結果です。すいません
rustのif, roopなどは式であるため、値を返す。rubyっぽい
rustのifはbool以外をエラーとする。jsは0, 1を評価できる。
rustには所有権がある。下記プログラムを実行するとs1は所有権を失っているため、エラーになる
let s1 = String::from("hello");
let s2 = s1;
println!("{}, world!", s1);
おもしろいな。
しかし、リテラルを扱う場合、スタックに存在するため、問題ない。例えば、下記なら、Hello, world!が出力できる。
let s1 = "hello";
let s2 = s1;
println!("{}, world!", s1);
また、メモリの有効範囲は下記になっている。作成したらメモリにpush。スコープを外れたら、メモリをpop(rustではdrop)。
{ // s is not valid here, it’s not yet declared
let s = "hello"; // s is valid from this point forward
// do stuff with s
} // this scope is now over, and s is no longer valid
また、& を使用すると、参照を使用するため、所有権は変わらない。
fn main() {
let s1 = String::from("hello");
let len = calculate_length(&s1);
println!("The length of '{}' is {}.", s1, len);
}
fn calculate_length(s: &String) -> usize {
s.len()
}
rustは関数内で引数に対して変更を実行できない(default)。
mutableにすることで可能になる。しかし、スコープ内で一度しかできない。もし複数回使用したければ、スコープを別にする。
rustは不変参照を複数回実行できるが、不変参照と、可変参照をくみあわせることはできない。
rustは終了する参照をリターンできない。下記の場合、ちょくせつstringを返すのが正解。
fn dangle() -> &String { // dangle returns a reference to a String
let s = String::from("hello"); // s is a new String
&s // we return a reference to the String, s
} // Here, s goes out of scope, and is dropped. Its memory goes away.
// Danger!
最終更新