Spaces:
Paused
Paused
File size: 4,603 Bytes
7c6f04a |
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 |
# 使用官方Python 3.9 Alpine作为基础镜像(轻量级)
FROM python:3.9-alpine
# 设置工作目录
WORKDIR /app
# 安装系统依赖
# 添加 yaml-dev 提供编译PyYAML所需的libyaml
# 添加 unzip 用于解压 Yacd
RUN apk add --no-cache \
curl \
ca-certificates \
tzdata \
tar \
gzip \
python3-dev \
musl-dev \
libffi-dev \
yaml-dev \
unzip \
# 不再需要 py3-yaml
# py3-yaml \
# 添加调试工具
file \
libc-utils \
strace
# 设置时区为亚洲/上海
ENV TZ=Asia/Shanghai
# 创建必要的目录 (不再需要在这里 chmod,因为 COPY 会处理)
RUN mkdir -p ./clash_core ./subconverter ./data
# 下载并安装Clash Meta,保留原始文件名
RUN echo "Downloading Clash Meta..." && \
curl -L -f -o /tmp/clash-meta.gz "https://github.com/MetaCubeX/Clash.Meta/releases/download/v1.16.0/clash.meta-linux-amd64-v1.16.0.gz" && \
echo "Extracting Clash Meta..." && \
gunzip -c /tmp/clash-meta.gz > ./clash_core/clash.meta-linux-amd64 && \
echo "Setting Clash Meta permissions..." && \
chmod +x ./clash_core/clash.meta-linux-amd64 && \
# 确保Linux可执行属性已设置
ls -la ./clash_core/clash.meta-linux-amd64 && \
# 显示文件类型
file ./clash_core/clash.meta-linux-amd64 && \
echo "Verifying Clash Meta exists..." && \
test -f ./clash_core/clash.meta-linux-amd64 && \
echo "Cleaning up Clash Meta download..." && \
rm /tmp/clash-meta.gz
# 下载并完整解压subconverter
RUN echo "Downloading subconverter..." && \
curl -L -f -o /tmp/subconverter.tar.gz "https://github.com/tindy2013/subconverter/releases/download/v0.7.2/subconverter_linux64.tar.gz" && \
echo "Extracting subconverter archive..." && \
tar -xzf /tmp/subconverter.tar.gz -C ./subconverter --strip-components=1 && \
echo "Setting subconverter permissions..." && \
chmod +x ./subconverter/subconverter && \
# 确保Linux可执行属性已设置
ls -la ./subconverter/subconverter && \
# 显示文件类型
file ./subconverter/subconverter && \
echo "Verifying subconverter exists..." && \
test -f ./subconverter/subconverter && \
echo "Cleaning up subconverter download..." && \
rm /tmp/subconverter.tar.gz
# 复制Python依赖列表
COPY requirements.txt ./
# 升级 pip
RUN pip install --upgrade pip
# 安装Cython(用于编译PyYAML)
RUN echo "Installing Cython for PyYAML build..." && \
pip install --no-cache-dir Cython
# 安装Python依赖(包括PyYAML,现在应该能成功编译了)
RUN echo "Installing Python dependencies..." && \
pip install --no-cache-dir -r requirements.txt
# 可选:删除构建依赖以减小镜像体积
RUN apk del python3-dev musl-dev libffi-dev yaml-dev
# 下载并准备 Yacd UI 文件 (从 Yacd-meta 的 gh-pages 分支)
RUN echo "Downloading Yacd-meta UI (gh-pages branch)..." && \
YACD_DIR=/app/app/static/yacd && \
mkdir -p ${YACD_DIR} && \
# 下载 gh-pages 分支的 zip 压缩包
curl -L -f -o /tmp/yacd-gh-pages.zip "https://github.com/MetaCubeX/Yacd-meta/archive/refs/heads/gh-pages.zip" && \
echo "Extracting Yacd-meta UI (gh-pages)..." && \
# 解压到临时目录
unzip -q /tmp/yacd-gh-pages.zip -d /tmp && \
# 将解压后的 gh-pages 目录下的 *所有内容* 移动到目标位置
# 注意:解压后的文件夹名通常是 {repo_name}-{branch_name},即 Yacd-meta-gh-pages
mv /tmp/Yacd-meta-gh-pages/* ${YACD_DIR}/ && \
echo "Cleaning up Yacd-meta download..." && \
rm /tmp/yacd-gh-pages.zip && \
rm -rf /tmp/Yacd-meta-gh-pages
# 在容器内创建空的 minimal_pref.yml 文件
RUN touch /app/subconverter/minimal_pref.yml
# 添加 COPY data 目录
COPY data/ ./data/
# 添加日志确认文件复制
RUN echo "${GREEN}Contents of /app/data after copy:${NC}" && ls -la ./data
# 设置环境变量
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
FLASK_APP=app.main \
FLASK_ENV=production \
FLASK_PORT=7860 \
CLASH_PROXY_PORT=7890 \
CLASH_API_PORT=9090 \
PORT=7860
# 复制应用代码和静态文件
COPY app/ ./app/
# 复制启动脚本并赋予执行权限
COPY entrypoint.sh ./
RUN chmod +x ./entrypoint.sh
# 给脚本和二进制文件执行权限 (可以简化)
# RUN chmod +x ./clash_core/clash.meta-linux-amd64 || true
# RUN chmod +x ./subconverter/subconverter || true
# 确保在下载后就已设置
# 暴露端口
EXPOSE $FLASK_PORT $CLASH_PROXY_PORT $CLASH_API_PORT
# 使用entrypoint脚本启动应用
ENTRYPOINT ["/app/entrypoint.sh"] |