開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. Rust >
  4. 【Rust】RustプロジェクトをDockerコンテナに移行してみる
no-image

【Rust】Rustプロジェクトを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が表示されれば成功です。

最後に

DB接続するための下準備として今回の記事を作成しました。次回こそRust WebAPI越しにDB操作できるようにしたいと思います。

参考資料

TOPに戻る