Skip to content

Commit

Permalink
Merge pull request #46 from traP-jp/feat/#27-docker-image
Browse files Browse the repository at this point in the history
第二部 - Docker イメージを作る
  • Loading branch information
kenken714 authored Nov 11, 2024
2 parents a507eea + 7b791ce commit 67253ad
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 51 deletions.
36 changes: 16 additions & 20 deletions docs/chapter2/section4/1_image.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,32 @@

### コードを書く

`naro_server`というディレクトリを作り、その中でコードを書いてください。第 1 部でやったように、 Go を使って下の条件を満たすサーバーアプリケーションを作ってください。
`naro_server`というディレクトリを作り、その中でコードを書いてください。第 1 部でやったように、 Rust を使って下の条件を満たすサーバーアプリケーションを作ってください。

- `/greeting`への GET リクエストに、環境変数 `GREETING_MESSAGE`の値を返す。
- 起動するポートを環境変数`PORT`で指定できる。

`go mod`コマンドで外部ライブラリを管理しましょう。

https://go.dev/ref/mod

```sh
go mod init naro_server
go mod tidy
```
ただし、 listen する IP アドレスとして、**必ず `0.0.0.0` を指定してください。**

:::details 答え
<<< @/chapter2/section4/src/main.go
<<< @/chapter2/section4/src/main.rs

`axum``tokio` の依存関係を追加する必要があります。
:::

### ビルドして実行する

今までは`go run`コマンドでプログラムを実行していましたが、Go では`go build`コマンドでコンパイルして実行ファイルを生成し、そのファイルを用いてプログラムを実行できます。
今までは`cargo run`コマンドでプログラムを実行していましたが、Rust では`cargo build`コマンドでコンパイルして実行ファイルを生成し、そのファイルを用いてプログラムを実行できます。

```sh
go build -o server
cargo build --release
```

上のコマンドを実行すると`server`というファイルが生成され、`./server`で実行できます
`--release`オプションをつけることで、最適化されたバイナリが生成されます

以下のコマンドで実行できます。
```sh
GREETING_MESSAGE="こんにちは" PORT="8080" ./server
GREETING_MESSAGE="こんにちは" PORT="8080" ./target/release/naro-server
```

実行前に環境変数を設定しています。
Expand All @@ -57,23 +53,23 @@ Dockerfile を書くと自分で必要な機能がそろったコンテナを立

ただ、アプリケーションを動かすだけであれば一度書いた Dockerfile を使いまわすことも可能なので、テンプレートを探してきてそれを使っても構いません。

以下が Go のプログラムを動かすための最小の Dockerfile です。
以下が Rust のプログラムを動かすための最小の Dockerfile です。

```Dockerfile
# Go のベースイメージを指定
FROM golang:1.20.5-alpine
# Rust のベースイメージを指定
FROM rust:latest

# コマンドを実行するコンテナ内のディレクトリをworkに指定
WORKDIR /work

# ローカルのカレントディレクトリをコンテナのカレントディレクトリ(work)にコピー
COPY . .

# Go のプログラムをビルド
RUN go build -o app
# Rust のプログラムをビルド
RUN cargo build --release

# ビルドしたものを実行
ENTRYPOINT ./app
ENTRYPOINT ["./target/release/naro-server"]
```

naro_server ディレクトリ内に`Dockerfile`というファイルを作り、上のコードを書きましょう。
Expand Down
31 changes: 0 additions & 31 deletions docs/chapter2/section4/src/main.go

This file was deleted.

25 changes: 25 additions & 0 deletions docs/chapter2/section4/src/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
use axum::{http::StatusCode, routing::get, Router};

#[tokio::main]
async fn main() {
let port = std::env::var("PORT")
.expect("failed to get env PORT")
.parse::<u16>()
.expect("failed to parse PORT");

let app = Router::new().route("/greeting", get(greeting_handler));

let addr = std::net::SocketAddr::from(([0, 0, 0, 0], port));

let listener = tokio::net::TcpListener::bind(&addr).await.unwrap();

println!("Listening on {}", addr);

axum::serve(listener, app).await.unwrap();
}

async fn greeting_handler() -> Result<(StatusCode, String), StatusCode> {
let greeting =
std::env::var("GREETING_MESSAGE").map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
Ok((StatusCode::OK, greeting))
}

0 comments on commit 67253ad

Please sign in to comment.