1
+ # 使用多阶段构建优化镜像大小
1
2
FROM python:3.11-alpine3.19 AS builder
2
3
4
+ # 减少 COPY 操作的次数
3
5
COPY ./package_list.txt /tmp/
4
- COPY ./requirements.txt /tmp/
5
- RUN apk add --no-cache --virtual .build-deps \
6
- libffi-dev \
7
- gcc \
8
- musl-dev \
9
- libxml2-dev \
10
- libxslt-dev \
11
- && apk add --no-cache $(cat /tmp/package_list.txt) \
12
- && curl https://rclone.org/install.sh | bash \
13
- && if [ "$(uname -m)" = "x86_64" ]; then ARCH=amd64; elif [ "$(uname -m)" = "aarch64" ]; then ARCH=arm64; fi \
14
- && curl https://dl.min.io/client/mc/release/linux-${ARCH}/mc --create-dirs -o /usr/bin/mc \
6
+
7
+ # 安装依赖,安装 rclone 和 mc,清理无用文件
8
+ RUN apk add --no-cache $(cat /tmp/package_list.txt) \
9
+ && curl -sSL https://rclone.org/install.sh | bash \
10
+ && ARCH=$(case "$(uname -m)" in x86_64) echo "amd64" ;; aarch64) echo "arm64" ;; esac) \
11
+ && curl -sSL https://dl.min.io/client/mc/release/linux-${ARCH}/mc -o /usr/bin/mc \
15
12
&& chmod +x /usr/bin/mc \
16
- && apk del --purge .build-deps \
17
13
&& rm -rf /tmp/* /root/.cache /var/cache/apk/*
14
+
15
+ # 添加 rootfs 文件
18
16
COPY --chmod=755 ./docker/rootfs /
17
+
18
+ # 最小化的运行时镜像
19
19
FROM scratch AS app
20
- COPY --from=Builder / /
20
+
21
+ # 复制 builder 阶段的内容到运行时
22
+ COPY --from=builder / /
23
+
24
+ # 设置环境变量
21
25
ENV S6_SERVICES_GRACETIME=30000 \
22
26
S6_KILL_GRACETIME=60000 \
23
27
S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 \
@@ -35,23 +39,41 @@ ENV S6_SERVICES_GRACETIME=30000 \
35
39
UMASK=000 \
36
40
NT_PORT=3000 \
37
41
WORKDIR="/nas-tools"
38
- RUN mkdir ${WORKDIR}
42
+
43
+ # 创建必要的目录
44
+ RUN mkdir -p ${WORKDIR} ${HOME}
45
+
46
+ # 复制应用代码到镜像
39
47
ADD ./ ${WORKDIR}/
40
48
41
- WORKDIR ${WORKDIR}
42
- RUN mkdir ${HOME} \
49
+ # 添加用户和用户组,并设置系统参数
50
+ RUN apk add --no-cache --virtual .build-deps \
51
+ libffi-dev \
52
+ gcc \
53
+ musl-dev \
54
+ libxml2-dev \
55
+ libxslt-dev \
43
56
&& addgroup -S nt -g 911 \
44
57
&& adduser -S nt -G nt -h ${HOME} -s /bin/bash -u 911 \
45
58
&& echo 'fs.inotify.max_user_watches=5242880' >> /etc/sysctl.conf \
46
59
&& echo 'fs.inotify.max_user_instances=5242880' >> /etc/sysctl.conf \
47
- && echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf \
60
+ && echo 'vm.overcommit_memory= 1' >> /etc/sysctl.conf \
48
61
&& echo "nt ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers \
49
- && curl -LsSf https://astral.sh/uv/install.sh | sh \
50
- && source $HOME/.local/bin/env \
51
- && uv sync
62
+ && curl -sSL https://astral.sh/uv/install.sh | sh \
63
+ && . $HOME/.local/bin/env \
64
+ && uv sync \
65
+ && apk del --purge .build-deps \
66
+ && rm -rf /tmp/* /root/.cache /var/cache/apk/*
52
67
68
+ # 健康检查
53
69
HEALTHCHECK --interval=30s --timeout=30s --retries=3 \
54
70
CMD wget -qO- http://localhost:${NT_PORT}/healthcheck || exit 1
55
- EXPOSE 3000
71
+
72
+ # 暴露端口
73
+ EXPOSE ${NT_PORT}
74
+
75
+ # 挂载配置目录
56
76
VOLUME ["/config" ]
57
- ENTRYPOINT [ "/init" ]
77
+
78
+ # 启动入口
79
+ ENTRYPOINT ["/init" ]
0 commit comments