Skip to content

Commit a691e4c

Browse files
committed
Optimize Dockerfile by consolidating layers and reducing build dependencies
1 parent 697db16 commit a691e4c

1 file changed

Lines changed: 53 additions & 126 deletions

File tree

Dockerfile

Lines changed: 53 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -7,151 +7,78 @@ FROM ${POSTGRES_IMAGE} AS builder
77

88
ARG PGBACKREST_VERSION
99

10-
# 安装编译依赖(仅在构建阶段)
10+
# 构建pgBackRest和下载rclone的单个优化层
1111
RUN 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+
# ===== 最终运行阶段 =====
5227
FROM ${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
9036
COPY --from=builder /usr/local/bin/rclone /usr/bin/rclone
9137

92-
# 复制备份脚本(在创建目录之前)
9338
COPY 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端口
15079
EXPOSE 5432
15180

152-
# 添加健康检查
15381
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
15482
CMD /backup/src/bin/healthcheck.sh
15583

156-
# 设置启动命令
15784
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]

0 commit comments

Comments
 (0)