-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
143 lines (108 loc) · 4.25 KB
/
Dockerfile
File metadata and controls
143 lines (108 loc) · 4.25 KB
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# =============================================================================
# TSN (Trust Stack Network) - Dockerfile multi-stage
# =============================================================================
# Build reproductible avec versions fixées des dépendances
# =============================================================================
# -----------------------------------------------------------------------------
# STAGE 1: Builder
# Image avec tous les outils de compilation
# -----------------------------------------------------------------------------
FROM rust:1.75-slim-bookworm AS builder
# Versions fixées des outils
ARG CARGO_AUDIT_VERSION=0.18.3
ARG CARGO_DENY_VERSION=0.14.11
ARG CARGO_TARPAULIN_VERSION=0.27.3
# Installation des dépendances système
RUN apt-get update && apt-get install -y --no-install-recommends \
pkg-config \
libssl-dev \
libclang-dev \
clang \
cmake \
git \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# Création d'un utilisateur non-root pour le build
RUN useradd -m -u 1000 -s /bin/bash builder
# Configuration du répertoire de travail
WORKDIR /build
# Copie des fichiers de dépendances en premier (pour le cache)
COPY --chown=builder:builder Cargo.toml Cargo.lock ./
COPY --chown=builder:builder .cargo/ ./.cargo/
# Pré-compilation des dépendances (cache layer)
RUN mkdir src && echo "fn main() {}" > src/main.rs
RUN cargo build --release && rm -rf src
# Copie du code source
COPY --chown=builder:builder . .
# Build de l'application en mode release
RUN cargo build --release --locked
# Vérification du binaire
RUN ls -la target/release/tsn && \
file target/release/tsn && \
ldd target/release/tsn || true
# -----------------------------------------------------------------------------
# STAGE 2: Runtime
# Image minimale pour l'exécution
# -----------------------------------------------------------------------------
FROM debian:bookworm-slim AS runtime
# Installation des dépendances runtime minimales
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
libssl3 \
curl \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean
# Création de l'utilisateur tsn
RUN groupadd -r tsn && useradd -r -g tsn -s /bin/false tsn
# Création des répertoires nécessaires
RUN mkdir -p /opt/tsn/data /opt/tsn/config /opt/tsn/logs && \
chown -R tsn:tsn /opt/tsn
# Copie du binaire depuis le builder
COPY --from=builder /build/target/release/tsn /opt/tsn/bin/tsn
# Configuration des permissions
RUN chmod +x /opt/tsn/bin/tsn && \
chown tsn:tsn /opt/tsn/bin/tsn
# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD curl -sf http://localhost:8080/health || exit 1
# Exposition des ports
EXPOSE 8080 30303
# Utilisateur non-root
USER tsn
# Répertoire de travail
WORKDIR /opt/tsn
# Point d'entrée
ENTRYPOINT ["/opt/tsn/bin/tsn"]
# Commande par défaut
CMD ["--config", "/opt/tsn/config/node.toml"]
# -----------------------------------------------------------------------------
# STAGE 3: Development (optionnel)
# Image avec outils de développement
# -----------------------------------------------------------------------------
FROM builder AS dev
# Installation des outils de développement
RUN cargo install cargo-watch cargo-audit@=${CARGO_AUDIT_VERSION} \
cargo-deny@=${CARGO_DENY_VERSION} \
cargo-tarpaulin@=${CARGO_TARPAULIN_VERSION}
# Configuration pour le développement
ENV RUST_BACKTRACE=1
ENV RUST_LOG=debug
WORKDIR /build
CMD ["cargo", "watch", "-x", "run"]
# -----------------------------------------------------------------------------
# STAGE 4: Distroless (optionnel, plus sécurisé)
# Image minimale sans shell
# -----------------------------------------------------------------------------
FROM gcr.io/distroless/cc-debian12 AS distroless
# Copie du binaire
COPY --from=builder /build/target/release/tsn /tsn
# Copie des certificats CA
COPY --from=runtime /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
# Configuration
ENV RUST_LOG=info
# Health check (note: distroless n'a pas curl, utiliser une alternative)
# HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
# CMD ["/tsn", "--version"] || exit 1
EXPOSE 8080 30303
USER nonroot:nonroot
ENTRYPOINT ["/tsn"]