@@ -7,151 +7,78 @@ FROM ${POSTGRES_IMAGE} AS builder
77
88ARG PGBACKREST_VERSION
99
10- # 安装编译依赖(仅在构建阶段)
10+ # 构建pgBackRest和下载rclone的单个优化层
1111RUN apk add --no-cache --virtual .build-deps \
12- curl \
13- unzip \
14- build-base \
15- gcc \
16- make \
17- cmake \
18- musl-dev \
19- openssl-dev \
20- lz4-dev \
21- zstd-dev \
22- bzip2-dev \
23- libxml2-dev \
24- postgresql-dev \
25- libc-dev \
26- zlib-dev \
27- yaml-dev \
28- meson \
29- ninja
30-
31- # 编译pgBackRest
32- RUN curl -L -o ${PGBACKREST_VERSION}.tar.gz \
33- https://github.com/pgbackrest/pgbackrest/archive/release/${PGBACKREST_VERSION}.tar.gz \
34- && tar -xzf ${PGBACKREST_VERSION}.tar.gz \
35- && rm -f ${PGBACKREST_VERSION}.tar.gz \
36- && mkdir /tmp/pgbackrest-build \
37- && meson setup pgbackrest-release-${PGBACKREST_VERSION} /tmp/pgbackrest-build \
38- && ninja -C /tmp/pgbackrest-build \
39- && ninja -C /tmp/pgbackrest-build install \
40- && strip /usr/local/bin/pgbackrest
41-
42- # 下载rclone(在构建阶段)
43- RUN curl -O https://downloads.rclone.org/rclone-current-linux-amd64.zip \
44- && unzip rclone-current-linux-amd64.zip \
45- && cd rclone-*-linux-amd64 \
46- && cp rclone /usr/local/bin/ \
12+ curl unzip build-base gcc make cmake musl-dev \
13+ openssl-dev lz4-dev zstd-dev bzip2-dev libxml2-dev \
14+ postgresql-dev libc-dev zlib-dev yaml-dev meson ninja \
15+ && curl -L https://github.com/pgbackrest/pgbackrest/archive/release/${PGBACKREST_VERSION}.tar.gz | tar -xz \
16+ && meson setup pgbackrest-release-${PGBACKREST_VERSION} /tmp/build \
17+ && ninja -C /tmp/build install \
18+ && strip /usr/local/bin/pgbackrest \
19+ && curl -L https://downloads.rclone.org/rclone-current-linux-amd64.zip -o rclone.zip \
20+ && unzip rclone.zip \
21+ && mv rclone-*/rclone /usr/local/bin/ \
4722 && chmod +x /usr/local/bin/rclone \
48- && cd .. \
49- && rm -rf rclone-* rclone-current-linux-amd64.zip
23+ && rm -rf /tmp/* /var/cache/apk/* pgbackrest-* rclone* \
24+ && apk del .build-deps
5025
51- # ===== 运行阶段:最终镜像 =====
26+ # ===== 最终运行阶段 =====
5227FROM ${POSTGRES_IMAGE}
5328
54- # 标签信息
55- LABEL maintainer="PostgreSQL NRT Backup Team"
56- LABEL description="PostgreSQL with pgBackRest and rclone for near real-time backup"
57- LABEL version="1.0"
5829
59- # 安装运行时必需的包(包括开发库以支持动态链接的二进制文件)
60- RUN apk add --no-cache \
61- bash \
62- gzip \
63- tar \
64- coreutils \
65- findutils \
66- dcron \
67- su-exec \
68- bc \
69- jq \
70- openssl \
71- openssl-dev \
72- lz4 \
73- lz4-dev \
74- zstd \
75- zstd-dev \
76- bzip2 \
77- bzip2-dev \
78- libxml2 \
79- libxml2-dev \
80- zlib \
81- zlib-dev \
82- yaml \
83- yaml-dev \
84- && rm -rf /var/cache/apk/*
30+ LABEL maintainer="https://github.com/whispin/postgres_nrt_backup" \
31+ description="PostgreSQL with pgBackRest and rclone for near real-time backup" \
32+ version="1.0"
8533
86- # 从构建阶段复制编译好的pgBackRest
87- COPY --from=builder /usr/local/bin/pgbackrest /usr/local/bin/pgbackrest
8834
89- # 从构建阶段复制rclone
35+ COPY --from=builder /usr/local/bin/pgbackrest /usr/local/bin/pgbackrest
9036COPY --from=builder /usr/local/bin/rclone /usr/bin/rclone
9137
92- # 复制备份脚本(在创建目录之前)
9338COPY src/ /backup/src/
39+ COPY config/pgbackrest.conf /etc/pgbackrest/pgbackrest.conf
9440
95- # 创建必要的目录和配置
96- RUN mkdir -p /etc/pgbackrest /var/log/pgbackrest /var/lib/pgbackrest \
97- /backup/logs /backup/local/base /backup/local/wal \
98- /var/lib/postgresql/data ~/.config/rclone \
99- /var/spool/cron/crontabs \
41+
42+ RUN apk add --no-cache bash gzip tar coreutils findutils dcron su-exec bc jq \
43+ openssl lz4 zstd bzip2 libxml2 zlib yaml \
44+ lz4-dev zstd-dev bzip2-dev libxml2-dev zlib-dev yaml-dev \
45+ && mkdir -p /etc/pgbackrest /var/log/pgbackrest /var/lib/pgbackrest \
46+ /backup/logs /backup/local/{base,wal} /var/lib/postgresql/data \
47+ ~/.config/rclone /var/spool/cron/crontabs \
10048 && chmod 750 /etc/pgbackrest /var/log/pgbackrest /var/lib/pgbackrest \
10149 && chmod 755 /var/spool/cron/crontabs \
102- && chown -R postgres:postgres /backup /var/log/pgbackrest /var/lib/pgbackrest /etc/pgbackrest
103-
104- # 设置脚本权限
105- RUN chmod +x /backup/src/bin/*.sh && \
106- chmod +x /backup/src/core/*.sh && \
107- chown -R postgres:postgres /backup
108-
109- # 保存原始的PostgreSQL入口点脚本(如果存在)
110- RUN if [ -f /usr/local/bin/docker-entrypoint.sh ]; then \
111- cp /usr/local/bin/docker-entrypoint.sh /usr/local/bin/postgres-docker-entrypoint.sh; \
112- fi
113-
114- # 复制自定义入口点脚本并设置权限
115- RUN cp /backup/src/bin/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh && \
116- chmod +x /usr/local/bin/docker-entrypoint.sh
117-
118- # 验证pgBackRest安装
119- RUN pgbackrest version
120-
121- # 复制pgbackrest基础配置文件
122- COPY config/pgbackrest.conf /etc/pgbackrest/pgbackrest.conf
123- RUN chmod 640 /etc/pgbackrest/pgbackrest.conf && chown postgres:postgres /etc/pgbackrest/pgbackrest.conf
124-
125- # 设置默认配置路径
126- ENV PGBACKREST_CONFIG=/etc/pgbackrest/pgbackrest.conf
50+ && chmod +x /backup/src/bin/*.sh /backup/src/core/*.sh \
51+ && chmod 640 /etc/pgbackrest/pgbackrest.conf \
52+ && chown -R postgres:postgres /backup /var/log/pgbackrest /var/lib/pgbackrest /etc/pgbackrest \
53+ && [ -f /usr/local/bin/docker-entrypoint.sh ] && \
54+ cp /usr/local/bin/docker-entrypoint.sh /usr/local/bin/postgres-docker-entrypoint.sh || true \
55+ && cp /backup/src/bin/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh \
56+ && chmod +x /usr/local/bin/docker-entrypoint.sh \
57+ && pgbackrest version \
58+ && rm -rf /var/cache/apk/*
12759
128- # 设置默认环境变量
129- ENV BACKUP_RETENTION_DAYS=3
130- ENV BASE_BACKUP_SCHEDULE="0 3 * * *"
131- ENV INCREMENTAL_BACKUP_SCHEDULE="0 */6 * * *"
132- ENV RCLONE_REMOTE_PATH="postgres-backups"
133- ENV RECOVERY_MODE="false"
134- ENV PGBACKREST_STANZA=""
135- ENV WAL_GROWTH_THRESHOLD="100MB"
136- ENV WAL_MONITOR_INTERVAL=60
137- ENV MIN_WAL_GROWTH_FOR_BACKUP="1MB"
138- ENV ENABLE_WAL_MONITOR="true"
139- ENV RECOVERY_TARGET_TIME=""
140- ENV RECOVERY_TARGET_NAME=""
141- ENV RECOVERY_TARGET_XID=""
142- ENV RECOVERY_TARGET_LSN=""
143- ENV RECOVERY_TARGET_INCLUSIVE="true"
144- ENV RECOVERY_TARGET_ACTION="promote"
145- # rclone配置方式(二选一):
146- # 1. RCLONE_CONF_BASE64 - Base64编码的rclone配置
147- # 2. 挂载rclone.conf文件到 /root/.config/rclone/rclone.conf
60+ # 环境变量(合并为单个ENV指令)
61+ ENV PGBACKREST_CONFIG=/etc/pgbackrest/pgbackrest.conf \
62+ BACKUP_RETENTION_DAYS=3 \
63+ BASE_BACKUP_SCHEDULE="0 3 * * *" \
64+ INCREMENTAL_BACKUP_SCHEDULE="0 */6 * * *" \
65+ RCLONE_REMOTE_PATH="postgres-backups" \
66+ RECOVERY_MODE="false" \
67+ PGBACKREST_STANZA="" \
68+ WAL_GROWTH_THRESHOLD="100MB" \
69+ WAL_MONITOR_INTERVAL=60 \
70+ MIN_WAL_GROWTH_FOR_BACKUP="5MB" \
71+ ENABLE_WAL_MONITOR="true" \
72+ RECOVERY_TARGET_TIME="" \
73+ RECOVERY_TARGET_NAME="" \
74+ RECOVERY_TARGET_XID="" \
75+ RECOVERY_TARGET_LSN="" \
76+ RECOVERY_TARGET_INCLUSIVE="true" \
77+ RECOVERY_TARGET_ACTION="promote"
14878
149- # 暴露PostgreSQL端口
15079EXPOSE 5432
15180
152- # 添加健康检查
15381HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
15482 CMD /backup/src/bin/healthcheck.sh
15583
156- # 设置启动命令
15784ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh" ]
0 commit comments