forked from gobackup/gobackup
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
213 lines (195 loc) · 7.23 KB
/
Copy pathDockerfile
File metadata and controls
213 lines (195 loc) · 7.23 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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# Stage 1: Build mydumper from source
FROM alpine:latest AS mydumper-builder
# https://github.com/mydumper/mydumper/tags
ARG MYDUMPER_VERSION="0.21.1-1"
RUN apk add --no-cache \
curl \
ca-certificates \
cmake \
make \
g++ \
glib-dev \
pcre-dev \
zlib-dev \
mariadb-dev && \
update-ca-certificates
RUN cd /tmp && \
curl -fLO "https://github.com/mydumper/mydumper/archive/refs/tags/v${MYDUMPER_VERSION}.tar.gz" && \
tar xzf "v${MYDUMPER_VERSION}.tar.gz" && \
cd "mydumper-${MYDUMPER_VERSION}" && \
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 . && \
make && \
make install
# # Stage 2: Download and extract xtrabackup
# FROM alpine:latest AS xtrabackup-downloader
# # https://github.com/percona/percona-xtrabackup/tags
# ARG XTRABACKUP_VERSION="8.4.0-4"
# RUN apk add --no-cache curl
# RUN mkdir -p /xtrabackup-bin && \
# case "$(uname -m)" in \
# x86_64) \
# cd /tmp && \
# curl -fLO "https://downloads.percona.com/downloads/Percona-XtraBackup-9.0/Percona-XtraBackup-${XTRABACKUP_VERSION}/binary/tarball/percona-xtrabackup-${XTRABACKUP_VERSION}-Linux-x86_64.glibc2.17-minimal.tar.gz" && \
# tar xzf "percona-xtrabackup-${XTRABACKUP_VERSION}-Linux-x86_64.glibc2.17-minimal.tar.gz" && \
# cp percona-xtrabackup-${XTRABACKUP_VERSION}-Linux-x86_64.glibc2.17-minimal/bin/* /xtrabackup-bin/ ;; \
# *) echo 'XtraBackup not available for this architecture, skipping...' ;; \
# esac
# Stage 3: Download sqlpackage
FROM alpine:latest AS sqlpackage-downloader
RUN apk add --no-cache wget unzip ca-certificates && update-ca-certificates
WORKDIR /tmp
RUN wget --tries=10 --retry-connrefused --waitretry=2 https://aka.ms/sqlpackage-linux && \
unzip sqlpackage-linux -d /opt/sqlpackage && \
chmod +x /opt/sqlpackage/sqlpackage
# Stage 4: Download influx CLI
FROM alpine:latest AS influx-downloader
ARG INFLUX_CLI_VERSION=2.7.5
RUN apk add --no-cache curl ca-certificates && update-ca-certificates
WORKDIR /tmp
RUN case "$(uname -m)" in \
x86_64) arch=amd64 ;; \
aarch64) arch=arm64 ;; \
*) echo 'Unsupported architecture' && exit 1 ;; \
esac && \
curl -fLO "https://dl.influxdata.com/influxdb/releases/influxdb2-client-${INFLUX_CLI_VERSION}-linux-${arch}.tar.gz" && \
tar xzf "influxdb2-client-${INFLUX_CLI_VERSION}-linux-${arch}.tar.gz" && \
mkdir -p /influx-bin && \
if [ -f influx ]; then \
cp influx /influx-bin/influx; \
else \
cp influxdb2-client-*/influx /influx-bin/influx; \
fi
# Stage 5: Download etcdctl
FROM alpine:latest AS etcd-downloader
# https://github.com/etcd-io/etcd/tags
ARG ETCD_VER="v3.6.6"
RUN apk add --no-cache curl ca-certificates && update-ca-certificates
RUN case "$(uname -m)" in \
x86_64) arch=amd64 ;; \
aarch64) arch=arm64 ;; \
*) echo 'Unsupported architecture' && exit 1 ;; \
esac && \
curl -fLO https://github.com/etcd-io/etcd/releases/download/${ETCD_VER}/etcd-${ETCD_VER}-linux-${arch}.tar.gz && \
tar xzf "etcd-${ETCD_VER}-linux-${arch}.tar.gz" && \
mkdir -p /etcd-bin && \
cp etcd-${ETCD_VER}-linux-${arch}/etcdctl /etcd-bin/etcdctl
# Stage 5.5: Download FoundationDB client tools
FROM alpine:latest AS foundationdb-downloader
# https://github.com/apple/foundationdb/releases
ARG FDB_VERSION="7.3.69"
RUN apk add --no-cache curl ca-certificates && update-ca-certificates
RUN mkdir -p /fdb-bin && \
case "$(uname -m)" in \
x86_64) \
cd /fdb-bin && \
curl -fLO "https://github.com/apple/foundationdb/releases/download/${FDB_VERSION}/fdbbackup.x86_64" && \
curl -fLO "https://github.com/apple/foundationdb/releases/download/${FDB_VERSION}/fdbcli.x86_64" && \
curl -fLO "https://github.com/apple/foundationdb/releases/download/${FDB_VERSION}/libfdb_c.x86_64.so" && \
mv fdbbackup.x86_64 fdbbackup && \
mv fdbcli.x86_64 fdbcli && \
mv libfdb_c.x86_64.so libfdb_c.so && \
chmod +x fdbbackup fdbcli ;; \
aarch64) \
cd /fdb-bin && \
curl -fLO "https://github.com/apple/foundationdb/releases/download/${FDB_VERSION}/fdbbackup.aarch64" && \
curl -fLO "https://github.com/apple/foundationdb/releases/download/${FDB_VERSION}/fdbcli.aarch64" && \
curl -fLO "https://github.com/apple/foundationdb/releases/download/${FDB_VERSION}/libfdb_c.aarch64.so" && \
mv fdbbackup.aarch64 fdbbackup && \
mv fdbcli.aarch64 fdbcli && \
mv libfdb_c.aarch64.so libfdb_c.so && \
chmod +x fdbbackup fdbcli ;; \
*) echo 'FoundationDB not available for this architecture, skipping...' ;; \
esac
# Stage 6: Build web assets
FROM node:20-alpine AS web-builder
WORKDIR /build/web
# Install git and certificates
RUN apk add --no-cache git ca-certificates && update-ca-certificates
# Enable pnpm via corepack
RUN corepack enable && corepack prepare pnpm@latest --activate
# Copy web package files
COPY web/package.json web/pnpm-lock.yaml* ./
# Install dependencies
RUN pnpm install --frozen-lockfile
# Copy web source
COPY web/ ./
# Build web assets
RUN pnpm build
# Stage 7: Build gobackup
FROM golang:1.24-alpine AS gobackup-builder
ARG VERSION=dev
WORKDIR /build
# Install build dependencies and certificates
RUN apk add --no-cache git ca-certificates && update-ca-certificates
# Copy go mod files first for better caching
COPY go.mod go.sum ./
RUN go mod download
# Copy source code
COPY . .
# Copy built web assets from previous stage
COPY --from=web-builder /build/web/dist ./web/dist
# Build with optimizations for minimal binary size
RUN CGO_ENABLED=0 GOOS=linux go build \
-ldflags="-s -w -X 'main.version=${VERSION}'" \
-trimpath \
-o gobackup \
.
# Stage 8: Final runtime image
FROM alpine:latest
ARG VERSION=dev
# Install runtime dependencies only
RUN apk add --no-cache \
curl \
ca-certificates \
openssl \
postgresql-client \
mariadb-connector-c \
mysql-client \
mariadb-backup \
redis \
mongodb-tools \
sqlite \
# replace busybox utils
tar \
gzip \
pigz \
bzip2 \
coreutils \
# there is no pbzip2 yet
lzip \
lzop \
xz \
# pixz is in edge atm
zstd \
# 7z compression with password support
7zip \
# microsoft sql dependencies
libstdc++ \
gcompat \
icu \
# support change timezone
tzdata \
# mydumper runtime dependencies
glib \
pcre \
zlib
# Copy mydumper from builder stage
COPY --from=mydumper-builder /usr/local/bin/mydumper /usr/local/bin/mydumper
COPY --from=mydumper-builder /usr/local/bin/myloader /usr/local/bin/myloader
# # Copy xtrabackup binaries (if they exist)
# COPY --from=xtrabackup-downloader /xtrabackup-bin/* /usr/local/bin/
# Copy sqlpackage
COPY --from=sqlpackage-downloader /opt/sqlpackage /opt/sqlpackage
ENV PATH="${PATH}:/opt/sqlpackage"
# Copy influx CLI
COPY --from=influx-downloader /influx-bin/influx /usr/local/bin/influx
# Copy etcdctl
COPY --from=etcd-downloader /etcd-bin/etcdctl /usr/local/bin/etcdctl
# Copy FoundationDB client tools
COPY --from=foundationdb-downloader /fdb-bin/ /usr/local/bin/
RUN if [ -f /usr/local/bin/libfdb_c.so ]; then mv /usr/local/bin/libfdb_c.so /usr/lib/; fi
# Copy gobackup binary from builder stage
COPY --from=gobackup-builder /build/gobackup /usr/local/bin/gobackup
# Create gobackup config directory
RUN mkdir -p /root/.gobackup
CMD ["/usr/local/bin/gobackup", "run"]