1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
version: '3.8'
services:
# Production service - minimal runtime
batuta:
build:
context: .
dockerfile: Dockerfile
image: batuta:latest
container_name: batuta-prod
volumes:
# Mount current directory as workspace
- .:/workspace:rw
# Cache Rust build artifacts
- cargo-cache:/usr/local/cargo/registry
environment:
- RUST_BACKTRACE=1
- BATUTA_LOG_LEVEL=info
working_dir: /workspace
# Override default CMD
command: batuta --help
restart: unless-stopped
# Development service - with hot reload
dev:
build:
context: .
dockerfile: Dockerfile.dev
image: batuta:dev
container_name: batuta-dev
volumes:
# Mount entire project for development
- .:/workspace:rw
# Persistent cargo cache
- cargo-cache:/home/batuta/.cargo/registry
- cargo-git:/home/batuta/.cargo/git
# Persistent target directory for faster rebuilds
- target-cache:/workspace/target
environment:
- RUST_BACKTRACE=full
- BATUTA_LOG_LEVEL=debug
working_dir: /workspace
ports:
- "8080:8080"
stdin_open: true
tty: true
command: cargo watch -x check -x test
# CI/CD service - runs tests
ci:
build:
context: .
dockerfile: Dockerfile
image: batuta:ci
container_name: batuta-ci
volumes:
- .:/workspace:ro
- cargo-cache:/usr/local/cargo/registry
environment:
- RUST_BACKTRACE=1
- CI=true
working_dir: /workspace
command: >
bash -c "
cargo test --all --features native &&
cargo clippy --all-targets --all-features -- -D warnings &&
cargo fmt -- --check
"
# WASM build service
wasm:
image: rust:1.75-slim
container_name: batuta-wasm
volumes:
- .:/workspace:rw
- cargo-cache:/usr/local/cargo/registry
working_dir: /workspace
environment:
- RUST_BACKTRACE=1
command: >
bash -c "
rustup target add wasm32-unknown-unknown &&
cargo install wasm-bindgen-cli &&
cargo build --target wasm32-unknown-unknown --no-default-features --features wasm --release &&
wasm-bindgen target/wasm32-unknown-unknown/release/batuta.wasm --out-dir wasm-dist --target web
"
# Documentation server
docs:
image: nginx:alpine
container_name: batuta-docs
volumes:
- ./book/book:/usr/share/nginx/html:ro
- ./wasm-dist:/usr/share/nginx/html/wasm:ro
ports:
- "8000:80"
restart: unless-stopped
volumes:
# Persistent volumes for caching
cargo-cache:
driver: local
cargo-git:
driver: local
target-cache:
driver: local
networks:
default:
name: batuta-network