# syntax=docker/dockerfile:1.7 # # 支持两种构建模式: # CI 模式: docker-context/ 已由 CI 脚本预下载好二进制和工具,直接 COPY(快) # 本地模式: 传入 --build-arg tag=vX.Y.Z,容器内自动下载二进制并运行 sync-built-in-tools(兼容 Windows/Mac) # # 本地构建示例: # docker build --build-arg tag=v0.8.0-rc.3 -t bililive-go . # docker build --build-arg tag=v0.8.0-rc.3 --platform linux/arm64 -t bililive-go:arm64 . FROM ubuntu:22.04 ARG tag ARG TARGETOS ARG TARGETARCH ARG TARGETVARIANT ARG TARGETPLATFORM ENV IS_DOCKER=true ENV WORKDIR="/srv/bililive" ENV OUTPUT_DIR="/srv/bililive" \ CONF_DIR="/etc/bililive-go" \ PORT=8080 ENV PUID=0 PGID=0 UMASK=022 RUN mkdir -p $OUTPUT_DIR && \ mkdir -p $CONF_DIR && \ mkdir -p /opt/bililive/tools && \ apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ curl \ tzdata \ ca-certificates \ libatomic1 && \ sh -c '\ if [ "$TARGETARCH" = "arm" ]; then \ echo "skip gosu for arm (armv7/armhf)"; \ else \ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends gosu; \ fi' && \ sh -c '\ if [ "$TARGETARCH" = "amd64" ] || [ "$TARGETARCH" = "arm64" ]; then \ echo "skip apt ffmpeg for $TARGETARCH"; \ else \ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ffmpeg; \ fi' && \ cp -r -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ apt-get clean && rm -rf /var/lib/apt/lists/* # =========================================================================== # 二进制安装(双模式) # CI 模式: docker-context/bin/ 已包含预编译的 bililive-go → 直接 COPY # 本地模式: 传入 --build-arg tag=vX.Y.Z → 从 GitHub Releases 下载 # =========================================================================== COPY docker-context/bin/ /tmp/prebuilt-bin/ RUN set -eux; \ if [ -f /tmp/prebuilt-bin/bililive-go ]; then \ echo "=== CI 模式: 使用预编译二进制 ==="; \ mv /tmp/prebuilt-bin/bililive-go /usr/bin/bililive-go; \ elif [ -n "${tag}" ]; then \ echo "=== 本地模式: 从 GitHub Releases 下载 (tag=${tag}) ==="; \ case $(arch) in \ aarch64) go_arch=arm64 ;; \ arm*) go_arch=arm ;; \ i386|i686) go_arch=386 ;; \ x86_64) go_arch=amd64 ;; \ *) echo "Unsupported arch: $(arch)"; exit 1 ;; \ esac; \ cd /tmp && \ curl -sSLO "https://github.com/bililive-go/bililive-go/releases/download/${tag}/bililive-linux-${go_arch}.tar.gz" && \ tar zxvf "bililive-linux-${go_arch}.tar.gz" "bililive-linux-${go_arch}" && \ chmod +x "bililive-linux-${go_arch}" && \ mv "./bililive-linux-${go_arch}" /usr/bin/bililive-go && \ rm "./bililive-linux-${go_arch}.tar.gz"; \ if [ "${tag}" != "$(/usr/bin/bililive-go --version 2>&1 | tr -d '\n')" ]; then \ echo "版本验证失败: 期望 ${tag},实际 $(/usr/bin/bililive-go --version 2>&1 | tr -d '\n')"; \ exit 1; \ fi; \ else \ echo "错误: 未找到可用的 bililive-go 二进制"; \ echo " CI 模式: 请确保 docker-context/bin/bililive-go 存在"; \ echo " 本地模式: docker build --build-arg tag=v0.8.0-rc.3 -t bililive-go ."; \ exit 1; \ fi; \ chmod +x /usr/bin/bililive-go; \ rm -rf /tmp/prebuilt-bin COPY config.docker.yml $CONF_DIR/config.yml # =========================================================================== # 内置工具安装(双模式) # CI 模式: docker-context/tools/ 已包含预下载的工具 → 直接 COPY # 本地模式: 使用 bililive-go --sync-built-in-tools-to-path 下载 # =========================================================================== COPY docker-context/tools/ /opt/bililive/tools/ RUN set -eux; \ HAS_TOOLS=$(find /opt/bililive/tools -mindepth 1 -not -name '.gitkeep' -print -quit | wc -l); \ if [ "$HAS_TOOLS" -gt 0 ]; then \ echo "=== CI 模式: 使用预下载的内置工具 ==="; \ find /opt/bililive/tools -name '.gitkeep' -delete 2>/dev/null || true; \ else \ echo "=== 本地模式: 通过 sync-built-in-tools 下载 ==="; \ /usr/bin/bililive-go --sync-built-in-tools-to-path /opt/bililive/tools || true; \ fi COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh VOLUME $OUTPUT_DIR EXPOSE $PORT WORKDIR ${WORKDIR} ENTRYPOINT [ "sh" ] CMD [ "/entrypoint.sh" ]