【Rust】RustプロジェクトをDockerコンテナに移行してみる
こんにちは。生まれも育ちも、今住んでいる場所も北海道ですが、永遠に北海道の冬に慣れる気がしないホンジョウです。
前回のRustでWebAPIを作ってみた記事の中で、DB接続もできるようにしたいという思いがあったので、今回はそれらをまとめて管理できるようにDockerに移行していきたいと思います。
前回の記事はこちら
前回のRustでWebAPIを作ってみた記事の中で、DB接続もできるようにしたいという思いがあったので、今回はそれらをまとめて管理できるようにDockerに移行していきたいと思います。
前回の記事はこちら
開発環境
- MacOS 13.4 Ventura
- Docker 4.6.1
- Rust 1.75.0 (Docker内で立ち上げ)
ディレクトリ構成
blog-web-api
├── backend
│ ├── Cargo.lock
│ ├── Cargo.toml
│ └── src
│ ├── controller
│ │ ├── mod.rs
│ │ └── users.rs
│ └── main.rs
└── infrastructure
├── docker
│ └── rust
│ └── Dockerfile
└── compose.yml
compose.ymlの記述
services:
app:
container_name: app
build: ./docker/rust
tty: true
volumes:
- ../backend:/work/backend
ports:
- 8083:8083
Dockerfileの記述
FROM rust:1.75.0
ENV CARGO_TARGET_DIR=/tmp/target \
DEBIAN_FRONTEND=noninteractive \
LC_CTYPE=ja_JP.utf8 \
LANG=ja_JP.utf8
RUN apt-get update \
&& apt-get upgrade -y \
&& apt-get install -y -q \
ca-certificates \
locales \
apt-transport-https\
libssl-dev \
libpq-dev \
pkg-config \
curl \
build-essential \
libdbus-1-dev \
libsqlite3-dev \
mariadb-client \
git \
wget \
&& echo "ja_JP UTF-8" > /etc/locale.gen \
&& locale-gen \
&& echo "install rust tools" \
&& rustup component add rustfmt \
&& cargo install cargo-watch cargo-make
WORKDIR /work/backend
Cargo.tomlの修正
前回の記事から少し間が空いてしまったので、Axumがバージョンアップしていました。最新バージョンにしたいと思います。
[package]
name = "backend"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
axum = "0.7.3"
tokio = { version = "1.23.0", features = ["full"] }
serde = { version = "1.0.149", features = ["derive"] }
serde_json = "1.0.89"
main.rsの修正
Axumをバージョンアップした結果、前回の書き方ではエラーになってしまったので、修正します。Axumはまだバージョン0.xなので、こういった破壊的変更がときどきあります。
use axum::{
routing::get,
Router,
response::Json,
response::IntoResponse,
http::StatusCode
};
use serde_json::json;
use std::net::SocketAddr;
mod controller;
#[tokio::main]
async fn main() {
let app = Router::new()
.route("/", get(root))
.route("/users", get(controller::users::get_users));
let listener = tokio::net::TcpListener::bind("0.0.0.0:8083")
.await
.unwrap();
axum::serve(listener, app).await.unwrap();
}
async fn root() -> impl IntoResponse {
(
StatusCode::OK,
Json(json!("OK"))
)
}
コンテナの立ち上げ
docker compose -p blog-web-api up -d
Rustプロジェクトの実行
docker compose -p blog-web-api exec app cargo watch -x run
これで localhost:8083/users にアクセスしてみましょう。前回の記事と同じJSONが表示されれば成功です。