File size: 2,891 Bytes
e668e78
 
3c72a85
e668e78
3c72a85
 
 
e668e78
 
 
c80fe81
e668e78
c80fe81
e668e78
 
c80fe81
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e668e78
 
 
 
 
 
 
 
 
 
 
 
c80fe81
 
 
e668e78
 
 
 
 
3c72a85
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
# 使用 Ubuntu 22.04 作为基础镜像,它是一个稳定且常用的 Linux 发行版。
FROM ubuntu:22.04

# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 设置容器内的工作目录。所有后续命令都将在此目录中执行。
WORKDIR /app

# 确保安装了 curl 和 jq,它们是用于从 GitHub API 获取下载链接的工具。
# ca-certificates 用于确保 HTTPS 连接的安全。
RUN apt-get update && apt-get install -y --no-install-recommends curl jq ca-certificates && rm -rf /var/lib/apt/lists/*

# 下载 OpenList 的最新 release 版本。
# 使用 GitHub API 获取最新 release 中文件名为 openlist-linux-amd64.tar.gz 的下载链接。
# jq 查询会查找名称中包含 "linux-amd64" 且以 ".tar.gz" 结尾的资产,并忽略大小写。
# 如果未找到 URL,则会输出错误并停止构建。
RUN LATEST_RELEASE_URL=$(curl -sL https://api.github.com/repos/OpenListTeam/OpenList/releases/latest | \
    jq -r '.assets?[] | select(.name | test("openlist-linux-amd64.*\\.tar\\.gz$"; "i")) | .browser_download_url') && \
    if [ -z "$LATEST_RELEASE_URL" ]; then \
        echo "Error: Could not find 'openlist-linux-amd64.tar.gz' or similar asset in latest release assets via GitHub API." && \
        # Fallback to direct download URL if API lookup fails, as a last resort
        wget -q -O openlist-linux-amd64.tar.gz -L https://github.com/OpenListTeam/OpenList/releases/latest/download/beta/openlist-linux-amd64.tar.gz || \
        (echo "Error: Direct download also failed. Cannot proceed." && exit 1); \
    else \
        echo "Downloading: openlist-linux-amd64.tar.gz from $LATEST_RELEASE_URL" && \
        wget -q -O openlist-linux-amd64.tar.gz "$LATEST_RELEASE_URL"; \
    fi


# 解压下载的 tarball,并确保 OpenList 可执行文件位于正确的位置并具有执行权限。
# OpenList 的 Go 二进制文件解压后可能在子目录中(例如,一个名为 OpenList 的文件夹)。
# 此命令会检查几种常见的解压情况,并将实际的 'openlist' 二进制文件移动到 /app 目录下。
RUN tar -xzf openlist-linux-amd64.tar.gz && \
    # 尝试将可执行文件移动到 /app 目录的根部
    (mv OpenList/openlist . || mv openlist . || find . -type f -name "openlist*" -exec mv {} . \;) && \
    # 清理可能存在的 OpenList 子目录,避免不必要的空间占用
    rm -rf OpenList && \
    # 授予 'openlist' 二进制文件执行权限
    chmod +x ./openlist

# 确保 /app 目录对容器内的运行用户具有写权限,以便应用可以创建其数据目录。
RUN chmod -R 777 /app

# 暴露应用程序监听的端口。OpenList 默认监听 5244 端口。
EXPOSE 5244

# 设置容器启动时执行的默认命令。
# 这是运行 OpenList 服务器的实际命令。
CMD ["./openlist", "server"]