forked from hanxi/xiaomusic
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
121 lines (103 loc) · 3.39 KB
/
Dockerfile
File metadata and controls
121 lines (103 loc) · 3.39 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
# 定义构建参数,用于指定架构和基础镜像
ARG PYTHON_VERSION=3.14
# 根据不同架构选择对应的基础镜像
FROM python:${PYTHON_VERSION}-alpine AS base-linux-amd64
FROM python:${PYTHON_VERSION}-alpine AS base-linux-arm64
FROM python:${PYTHON_VERSION}-bookworm AS base-linux-arm-v7
FROM python:${PYTHON_VERSION}-alpine AS run-linux-amd64
FROM python:${PYTHON_VERSION}-alpine AS run-linux-arm64
FROM python:${PYTHON_VERSION}-bookworm AS run-linux-arm-v7
FROM --platform=$BUILDPLATFORM alpine AS shelf
# 这里的逻辑是关键:接收标准的 TARGETPLATFORM (如 linux/amd64)
# 并将其转换为我们定义的别名格式 (如 linux-amd64)
ARG TARGETPLATFORM
RUN echo ${TARGETPLATFORM//\//-} > /platform_id
# 根据TARGETPLATFORM自动选择对应的builder阶段
ARG TARGETPLATFORM
FROM base-${TARGETPLATFORM//\//-} AS builder
# 安装构建依赖(根据基础镜像类型区分)
RUN if [ -f /etc/alpine-release ]; then \
# Alpine系统依赖
apk add --no-cache \
build-base \
nodejs \
npm \
zlib-dev \
jpeg-dev \
freetype-dev \
lcms2-dev \
openjpeg-dev \
tiff-dev \
libwebp-dev; \
else \
# Debian系统依赖
apt-get update && apt-get install -y --no-install-recommends \
build-essential \
nodejs \
npm \
zlib1g-dev \
libjpeg-dev \
libfreetype6-dev \
liblcms2-dev \
libopenjp2-7-dev \
libtiff5-dev \
libwebp-dev \
&& rm -rf /var/lib/apt/lists/*; \
fi
# 安装PDM
RUN pip install -U pdm
ENV PDM_CHECK_UPDATE=false
WORKDIR /app
COPY pyproject.toml README.md package.json ./
# 安装Python和Node.js依赖
RUN pdm install --prod --no-editable -v
RUN npm install --loglevel=verbose
# 复制应用代码
COPY xiaomusic/ ./xiaomusic/
COPY plugins/ ./plugins/
COPY holiday/ ./holiday/
COPY xiaomusic.py .
# -------------------------- 运行阶段 --------------------------
# 根据TARGETPLATFORM自动选择对应的runner阶段
ARG TARGETPLATFORM
FROM run-${TARGETPLATFORM//\//-} AS runner
# 安装运行时依赖(区分Alpine和Debian)
RUN if [ -f /etc/alpine-release ]; then \
# Alpine运行时依赖
apk add --no-cache \
ffmpeg \
nodejs \
npm; \
else \
# Debian运行时依赖
apt-get update && apt-get install -y --no-install-recommends \
ffmpeg \
nodejs \
npm \
&& rm -rf /var/lib/apt/lists/*; \
fi
# 设置工作目录
WORKDIR /app
# 从构建阶段复制产物
COPY --from=builder /app/.venv ./.venv
COPY --from=builder /app/node_modules ./node_modules/
COPY --from=builder /app/xiaomusic/ ./xiaomusic/
COPY --from=builder /app/plugins/ ./plugins/
COPY --from=builder /app/holiday/ ./holiday/
COPY --from=builder /app/xiaomusic.py .
COPY --from=builder /app/xiaomusic/__init__.py /base_version.py
COPY --from=builder /app/package.json .
# 创建FFmpeg软链接目录(兼容不同系统的ffmpeg路径)
RUN mkdir -p /app/ffmpeg/bin \
&& ln -s $(which ffmpeg) /app/ffmpeg/bin/ffmpeg \
&& ln -s $(which ffprobe) /app/ffmpeg/bin/ffprobe
RUN touch /app/.dockerenv
# 设置卷和暴露端口
VOLUME /app/conf
VOLUME /app/music
EXPOSE 8090
# 设置环境变量
ENV TZ=Asia/Shanghai
ENV PATH=/app/.venv/bin:/usr/local/bin:$PATH
# 直接启动xiaomusic应用
CMD ["/app/.venv/bin/python3", "/app/xiaomusic.py"]