» Rust:使用Socket.IO创建Web Chat App在线聊天应用 » 3. 部署 » 3.1 Dockerfile

Dockerfile

Docker 允许开发人员将他们的应用程序以及所有依赖项打包成一个称为容器的单个单元。这确保了在不同环境(如开发、测试和生产)之间的一致性,减少了“但是它在我的机器上运行正常”的问题。

添加 Makefile

Makefile 是在软件开发项目中使用的一种特殊文件(特别是在类 Unix 操作系统中),用于自动化从源代码编译和构建可执行程序或库。

创建 Makefile:

# Binary name
BINARY_NAME=lr_webchat_rs

.PHONY: lint

lint:
	@echo "Linting..."
	cargo clippy

build:
	@echo "Building $(BINARY_NAME)..."
	cargo build --release --bin $(BINARY_NAME)

Clippy 是 Rust 生态中知名的 lint 工具。

执行 make build 以构建二进制文件:

make build

这等同于 cargo build --release --bin lr_webchat_rs。它将在项目 target/release 目录中创建一个名为 lr_webchat_rs 的二进制文件。

然后,你可以直接运行它:

./target/release/lr_webchat_rs

服务的 Dockerfile

添加 Dockerfile:

# Use a Rust Docker image as the base
FROM rust:1.77-alpine3.19 as builder

# Set the working directory inside the container
WORKDIR /app

# Install necessary packages
RUN apk update && \
    apk add --no-cache musl-dev pkgconfig openssl-dev

# Copy the Rust project files to the container
COPY Cargo.toml .
COPY src/ /app/src

# Define a build argument with a default value
ARG BINARY_NAME=lr_webchat_rs

# Build the Rust project
# See: https://github.com/rust-lang/rust/issues/115430
RUN RUSTFLAGS="-Ctarget-feature=-crt-static" cargo build --release --bin ${BINARY_NAME}

# Start a new stage from Alpine Linux
FROM alpine:3.19

# Install required packages
RUN apk update && \
    apk add --no-cache libgcc

# Define an environment variable from the build argument
ENV BINARY_NAME=lr_webchat_rs

# Set the working directory inside the container
WORKDIR /app

# Copy the built binary from the previous stage to the current stage
COPY --from=builder /app/target/release/${BINARY_NAME} .

# Command to run the binary when the container starts
CMD ./${BINARY_NAME}

准备好后端的 Dockerfile 之后,就可以在 Docker Compose 里配合前端 app 一起启动了。