使用 docker-compose 在本地运行 rust sqlx 迁移

BWS*_*rns 4 rust docker docker-compose rust-sqlx

我正在使用 Rust 从零到产品,但我有点脱离了脚本。我正在努力在本地对整个设置进行 docker 化,包括数据库。在ENTRYPOINT容器上调用一个启动脚本,该脚本尝试调用sqlx migrate run,导致错误./scripts/init_db.sh: line 10: sqlx: command not found

我想我已经解决了这个问题,因为我使用的bullseye-slim是运行时,所以它不会为最终映像保留已安装的 Rust 包,这有助于缩短构建时间和映像大小。

有没有一种方法可以在不安装 Rust、Cargo 等的情况下运行 sqlx 迁移?或者有更好的方法来完成这个任务吗?我想避免只是重新安装bullseye-slim映像中的所有内容并丢失一些 docker 优化。

# Dockerfile
# .... chef segment omitted
FROM chef as builder
COPY --from=planner /app/recipe.json recipe.json
# Build our project dependencies, not our application!
RUN cargo chef cook --release --recipe-path recipe.json
# Up to this point, if our dependency tree stays the same,
# all layers should be cached.
COPY . .

ENV SQLX_OFFLINE true
# Build our project
RUN cargo build --release --bin my_app
FROM debian:bullseye-slim AS runtime
WORKDIR /app
RUN apt-get update -y \
&& apt-get install -y --no-install-recommends openssl ca-certificates \
&& apt-get install -y --no-install-recommends postgresql-client \
# Clean up
&& apt-get autoremove -y \
&& apt-get clean -y \
&& rm -rf /var/lib/apt/lists/*
COPY --from=builder /app/target/release/my_app my_app
COPY configuration configuration
COPY scripts scripts
RUN chmod -R +x scripts
ENTRYPOINT ["./scripts/docker_startup.sh"]

Run Code Online (Sandbox Code Playgroud)

docker-compose.yml看起来像下面

version: '3'
services:
  db:
    image: postgres:latest
    environment:
      - POSTGRES_DB=my_app
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=password
    ports:
      - "5432:5432"
    volumes:
      - dbdata:/var/lib/postgresql/data

  app:
    image: my_app
    environment:
      - DATABASE_URL=postgres://postgres:password@postgres:5432/my_app
    depends_on:
      - db
    ports:
      - "8080:8080"

volumes:
  dbdata:
    driver: local

Run Code Online (Sandbox Code Playgroud)

pig*_*nds 5

您可以sqlx-cli在构建阶段使用 Cargo install进行安装

cargo install sqlx-cli
Run Code Online (Sandbox Code Playgroud)

然后将其复制到部署阶段

COPY --from=builder $HOME/.cargo/bin/sqlx-cli sqlx-cli
Run Code Online (Sandbox Code Playgroud)

或者,您可以在应用程序启动迁移时运行迁移

sqlx::migrate!("db/migrations")
    .run(&pool)
    .await?;
Run Code Online (Sandbox Code Playgroud)