Преглед на файлове

将docker镜像构建过程分解成两个阶段 (#389)

* 将docker镜像构建过程分解成两个阶段

* 增加docker部署教程

* fix 版本

* fix ls error

* 合并所有编译和docker构建到一个release action中

* 删除旧的Dockerfile

* 无需SECRETS
devome преди 3 години
родител
ревизия
e6b41ed260

+ 0 - 50
.github/workflows/Build ChineseSubFinder DockerImage-Beta-amd64.yml

@@ -1,50 +0,0 @@
-name: Build ChineseSubFinder DockerImage-Beta
-
-on:
-  push:
-    tags:
-      - v*.*-Beta*
-      - v*.*-DockerBeta*
-  workflow_dispatch:
-
-jobs:
-  buildx:
-    runs-on: ubuntu-latest
-    steps:
-      - name: Checkout
-        uses: actions/checkout@v2
-      # 获取 tag 版本
-      - name: Set Version
-        id: set-version
-        run: |
-          echo "::set-output name=version::${GITHUB_REF:10}"
-          echo "ReleaseTag=${GITHUB_REF:10}"
-
-      # Docker Image 构建环境
-      - name: Set up QEMU
-        uses: docker/setup-qemu-action@v1
-
-      - name: Set up Docker Buildx
-        uses: docker/setup-buildx-action@v1
-
-      - name: Login to DockerHub
-        uses: docker/login-action@v1
-        with:
-          username: ${{ secrets.DOCKER_USERNAME }}
-          password: ${{ secrets.DOCKER_PASSWORD }}
-
-      # Build and push
-      - name: Build dockerfile
-        uses: docker/build-push-action@v3
-        with:
-          file: ./Dockerfile
-          platforms: linux/amd64
-          push: true
-          tags: |
-            ${{ secrets.DOCKER_USERNAME }}/chinesesubfinder:${{ steps.set-version.outputs.version }}
-          build-args: |
-            VERSION=${{ steps.set-version.outputs.version }}
-          secrets: |
-            "BASEKEY=${{ secrets.BASEKEY }}"
-            "AESKEY16=${{ secrets.AESKEY16 }}"
-            "AESIV16=${{ secrets.AESIV16 }}"

+ 0 - 50
.github/workflows/Build ChineseSubFinder DockerImage-Release.yml

@@ -1,50 +0,0 @@
-name: Build ChineseSubFinder DockerImage-Release-amd64
-
-on:
-  push:
-    tags:
-      - v*.*.*
-  workflow_dispatch:
-
-jobs:
-  buildx:
-    runs-on: ubuntu-latest
-    steps:
-      - name: Checkout
-        uses: actions/checkout@v2
-      # 获取 tag 版本
-      - name: Set Version
-        id: set-version
-        run: |
-          echo "::set-output name=version::${GITHUB_REF:10}"
-          echo "ReleaseTag=${GITHUB_REF:10}"
-
-      # Docker Image 构建环境
-      - name: Set up QEMU
-        uses: docker/setup-qemu-action@v1
-
-      - name: Set up Docker Buildx
-        uses: docker/setup-buildx-action@v1
-
-      - name: Login to DockerHub
-        uses: docker/login-action@v1
-        with:
-          username: ${{ secrets.DOCKER_USERNAME }}
-          password: ${{ secrets.DOCKER_PASSWORD }}
-
-      # Build and push
-      - name: Build dockerfile
-        uses: docker/build-push-action@v3
-        with:
-          file: ./Dockerfile
-          platforms: linux/amd64,linux/arm64
-          push: true
-          tags: |
-            ${{ secrets.DOCKER_USERNAME }}/chinesesubfinder:${{ steps.set-version.outputs.version }}
-            ${{ secrets.DOCKER_USERNAME }}/chinesesubfinder:latest
-          build-args: |
-            VERSION=${{ steps.set-version.outputs.version }}
-          secrets: |
-            "BASEKEY=${{ secrets.BASEKEY }}"
-            "AESKEY16=${{ secrets.AESKEY16 }}"
-            "AESIV16=${{ secrets.AESIV16 }}"

+ 41 - 0
.github/workflows/build-base-image.yml

@@ -0,0 +1,41 @@
+name: 构建镜像:chinesesubfinder-base
+on:
+  workflow_dispatch:
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    name: 构建镜像:chinesesubfinder-base
+    steps:
+      - 
+        name: Checkout
+        uses: actions/checkout@master
+      
+      - 
+        name: Set Up QEMU
+        uses: docker/setup-qemu-action@v2
+
+      - 
+        name: Set Up Buildx
+        uses: docker/setup-buildx-action@v2
+
+      - 
+        name: Login DockerHub
+        uses: docker/login-action@v2
+        with:
+          username: ${{ secrets.DOCKER_USERNAME }}
+          password: ${{ secrets.DOCKER_PASSWORD }}
+
+      - 
+        name: Buildx
+        uses: docker/build-push-action@v3
+        with:
+          context: docker
+          file: docker/base.Dockerfile
+          platforms: |
+            linux/amd64
+            linux/arm64
+            linux/arm/v7
+          push: true
+          tags: |
+            ${{ secrets.DOCKER_USERNAME }}/chinesesubfinder-base:latest

+ 0 - 48
.github/workflows/goreleaser-ChineseSubFinder-Beta.yml

@@ -1,48 +0,0 @@
-name: goreleaser-ChineseSubFinder
-
-on:
-  push:
-    tags:
-      - v*.*-Beta*
-      - v*.*-ExeBeta*
-  workflow_dispatch:
-
-jobs:
-  goreleaser:
-    runs-on: ubuntu-latest
-    steps:
-      - name: Checkout
-        uses: actions/checkout@v2
-        with:
-          fetch-depth: 0
-
-      - name: Setup npm
-        uses: bahmutov/npm-install@v1
-        with:
-          working-directory: frontend
-
-      - name: frontend install depandence
-        run: npm ci
-        working-directory: frontend
-
-      - name: frontend build
-        run: npm run build
-        working-directory: frontend
-
-      - name: Set up Go
-        uses: actions/setup-go@v2
-        with:
-          go-version: 1.17
-
-      - name: Run GoReleaser
-        uses: goreleaser/goreleaser-action@v2
-        with:
-          # either 'goreleaser' (default) or 'goreleaser-pro'
-          distribution: goreleaser
-          version: latest
-          args: release -f .goreleaser-ChineseSubFinder.yml --rm-dist
-        env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN  }}
-          BASEKEY: ${{ secrets.BASEKEY }}
-          AESKEY16: ${{ secrets.AESKEY16 }}
-          AESIV16: ${{ secrets.AESIV16 }}

+ 0 - 47
.github/workflows/goreleaser-ChineseSubFinder.yml

@@ -1,47 +0,0 @@
-name: goreleaser-ChineseSubFinder
-
-on:
-  push:
-    tags:
-      - v*.*.*
-  workflow_dispatch:
-
-jobs:
-  goreleaser:
-    runs-on: ubuntu-latest
-    steps:
-      - name: Checkout
-        uses: actions/checkout@v2
-        with:
-          fetch-depth: 0
-
-      - name: Setup npm
-        uses: bahmutov/npm-install@v1
-        with:
-          working-directory: frontend
-
-      - name: frontend install depandence
-        run: npm ci
-        working-directory: frontend
-
-      - name: frontend build
-        run: npm run build
-        working-directory: frontend
-
-      - name: Set up Go
-        uses: actions/setup-go@v2
-        with:
-          go-version: 1.17
-
-      - name: Run GoReleaser
-        uses: goreleaser/goreleaser-action@v2
-        with:
-          # either 'goreleaser' (default) or 'goreleaser-pro'
-          distribution: goreleaser
-          version: latest
-          args: release -f .goreleaser-ChineseSubFinder.yml --rm-dist
-        env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN  }}
-          BASEKEY: ${{ secrets.BASEKEY }}
-          AESKEY16: ${{ secrets.AESKEY16 }}
-          AESIV16: ${{ secrets.AESIV16 }}

+ 103 - 0
.github/workflows/release.yml

@@ -0,0 +1,103 @@
+name: release
+
+on:
+  push:
+    tags:
+      - v*.*.*
+      - v*.*-Beta*
+      - v*.*-ExeBeta*
+  workflow_dispatch:
+
+jobs:
+  goreleaser:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v2
+        with:
+          fetch-depth: 0
+
+      - name: Setup npm
+        uses: bahmutov/npm-install@v1
+        with:
+          working-directory: frontend
+
+      - name: frontend install depandence
+        run: npm ci
+        working-directory: frontend
+
+      - name: frontend build
+        run: npm run build
+        working-directory: frontend
+
+      - name: Set up Go
+        uses: actions/setup-go@v2
+        with:
+          go-version: 1.17
+
+      - name: Run GoReleaser
+        uses: goreleaser/goreleaser-action@v2
+        with:
+          # either 'goreleaser' (default) or 'goreleaser-pro'
+          distribution: goreleaser
+          version: latest
+          args: release -f .goreleaser-ChineseSubFinder.yml --rm-dist
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN  }}
+          BASEKEY: ${{ secrets.BASEKEY }}
+          AESKEY16: ${{ secrets.AESKEY16 }}
+          AESIV16: ${{ secrets.AESIV16 }}
+  
+  buildx:
+    runs-on: ubuntu-latest
+    needs: goreleaser
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v2
+      
+      - name: Set Version
+        id: set-version
+        run: |
+          echo "::set-output name=version::${GITHUB_REF:10}"
+          echo "ReleaseTag=${GITHUB_REF:10}"
+
+      - name: Set up QEMU
+        uses: docker/setup-qemu-action@v2
+
+      - name: Set up Docker Buildx
+        uses: docker/setup-buildx-action@v2
+
+      - name: Login to DockerHub
+        uses: docker/login-action@v2
+        with:
+          username: ${{ secrets.DOCKER_USERNAME }}
+          password: ${{ secrets.DOCKER_PASSWORD }}
+
+      # 当 tag 不包括 Beta 字样时
+      - name: Build Latest Image
+        if: "!contains(steps.set-version.outputs.version, 'Beta')"
+        uses: docker/build-push-action@v3
+        with:
+          context: docker
+          file: docker/Dockerfile
+          platforms: linux/amd64,linux/arm64,linux/arm/v7
+          push: true
+          tags: |
+            ${{ secrets.DOCKER_USERNAME }}/chinesesubfinder:${{ steps.set-version.outputs.version }}
+            ${{ secrets.DOCKER_USERNAME }}/chinesesubfinder:latest
+          build-args: |
+            VERSION=${{ steps.set-version.outputs.version }}
+      
+      # 当 tag 包括 Beta 字样时
+      - name: Build Beta Image
+        if: contains(steps.set-version.outputs.version, 'Beta')
+        uses: docker/build-push-action@v3
+        with:
+          context: docker
+          file: docker/Dockerfile
+          platforms: linux/amd64,linux/arm64,linux/arm/v7
+          push: true
+          tags: |
+            ${{ secrets.DOCKER_USERNAME }}/chinesesubfinder:${{ steps.set-version.outputs.version }}
+          build-args: |
+            VERSION=${{ steps.set-version.outputs.version }}

+ 0 - 15
Docker/root/etc/cont-init.d/30-config

@@ -1,15 +0,0 @@
-#!/usr/bin/with-contenv bash
-
-# 检查config配置文件,并创建
-#if [ ! -e "/config/config.yaml" ] ;  then
-#cp /app/config.yaml /config/config.yaml
-#fi
-#
-## 检查用户config配置文件,并移动.
-#if [ -e "/config/config.yaml" ] ;  then
-#cp /config/config.yaml /app/config.yaml
-#fi
-#
-## 容器启动时下载最新示例文件
-#rm -f /config/config.yaml.sample
-#wget -q -O /config/config.yaml.sample https://cdn.jsdelivr.net/gh/allanpk716/ChineseSubFinder/config.yaml.sample

+ 0 - 16
Docker/root/etc/cont-init.d/50-config

@@ -1,16 +0,0 @@
-#!/usr/bin/with-contenv bash
-
-mkdir -p /root/.cache
-# permissions
-chown -R abc:abc \
-    /app \
-    /root \
-    /config
-    
-if [ "${PERMS}" = true ]
-then
-  chown -R abc:abc /media
-fi
-
-chmod a+x \
-    /app/chinesesubfinder

+ 0 - 2
Docker/root/etc/cont-init.d/90-custom-folders

@@ -1,2 +0,0 @@
-#!/usr/bin/with-contenv bash
-

+ 0 - 2
Docker/root/etc/cont-init.d/99-custom-scripts

@@ -1,2 +0,0 @@
-#!/usr/bin/with-contenv bash
-

+ 0 - 6
Docker/root/etc/services.d/chinesesubfinder/run

@@ -1,6 +0,0 @@
-#!/usr/bin/with-contenv bash
-# 开启 Xvfb 给 Chrome 使用
-Xvfb -ac :99 -screen 0 1280x1024x16 & export DISPLAY=:99
-
-# 启动chinesesubfinder
-cd /app && exec s6-setuidgid abc ./chinesesubfinder

+ 0 - 85
Dockerfile

@@ -1,85 +0,0 @@
-FROM library/node:16-alpine as frontBuilder
-
-USER root
-RUN mkdir -p /usr/src/app
-WORKDIR /usr/src/app
-add ./frontend/.npmrc /usr/src/app
-add ./frontend/package.json /usr/src/app
-add ./frontend/package-lock.json /usr/src/app
-RUN npm ci
-COPY ./frontend /usr/src/app
-RUN ls -al
-RUN npm run build && ls -al dist/spa
-
-
-FROM golang:1.17-buster AS builder
-ARG VERSION=0.0.10
-LABEL stage=gobuilder
-
-# 开始编译
-ENV CGO_ENABLED 1
-ENV GO111MODULE=on
-ENV GOOS linux
-#ENV GOPROXY https://goproxy.cn,direct
-
-# 切换工作目录
-WORKDIR /homelab/buildspace
-COPY . .
-# 把前端编译好的文件 copy 过来
-COPY --from=frontBuilder /usr/src/app/dist/spa /homelab/buildspace/frontend/dist/spa
-
-
-# 执行编译,-o 指定保存位置和程序编译名称
-RUN --mount=type=secret,id=BASEKEY \
-      --mount=type=secret,id=AESKEY16 \
-      --mount=type=secret,id=AESIV16 \
-    export BASEKEY=$(cat /run/secrets/BASEKEY) && \
-      export AESKEY16=$(cat /run/secrets/AESKEY16) && \
-      export AESIV16=$(cat /run/secrets/AESIV16) && \
-    cd ./cmd/chinesesubfinder && \
-    go build -ldflags="-s -w --extldflags '-static -fpic' -X main.AppVersion=${VERSION} -X main.BaseKey=$BASEKEY -X main.AESKey16=$AESKEY16 -X main.AESIv16=$AESIV16" -o /app/chinesesubfinder
-
-# 运行时环境
-FROM lsiobase/ubuntu:bionic
-
-ENV TZ=Asia/Shanghai PERMS=true \
-    PUID=1026 PGID=100
-
-RUN  ln -s /root/.cache/rod/browser/$(ls /root/.cache/rod/browser)/chrome-linux/chrome /usr/bin/chrome && \
-    # sed -i "s@http://archive.ubuntu.com@http://mirrors.aliyun.com@g" /etc/apt/sources.list && rm -Rf /var/lib/apt/lists/* && \
-    apt-get update && \
-    apt-get install --no-install-recommends -y \
-    yasm ffmpeg \
-    # C、C++ 支持库
-    libgcc-6-dev libstdc++6 \
-    # chromium dependencies
-    libnss3 \
-    libxss1 \
-    libasound2 \
-    libxtst6 \
-    libgtk-3-0 \
-    libgbm1 \
-    # fonts
-    fonts-liberation fonts-noto-color-emoji fonts-noto-cjk \
-    # processs reaper
-    dumb-init \
-    # headful mode support, for example: $ xvfb-run chromium-browser --remote-debugging-port=9222
-    xvfb \
-    xorg gtk2-engines-pixbuf \
-    dbus-x11 xfonts-base xfonts-100dpi xfonts-75dpi xfonts-cyrillic xfonts-scalable \
-    imagemagick x11-apps \
-    # 通用
-    ca-certificates \
-    wget \
-    # cleanup
-    && apt-get clean \
-    && rm -rf \
-       /tmp/* \
-       /var/lib/apt/lists/* \
-       /var/tmp/*
-
-COPY Docker/root/ /
-# 主程序
-COPY --from=builder /app/chinesesubfinder /app/chinesesubfinder
-
-VOLUME /config /media

+ 2 - 1
README.md

@@ -17,10 +17,11 @@
 
 ## How to use
 
-有两个文档可以参考:
+有以下文档可以参考:
 
 - [v0.26 教程、更新说明](https://github.com/allanpk716/ChineseSubFinder/tree/docs/DesignFile/v0.26教程)
 - [对外的 http api](https://github.com/allanpk716/ChineseSubFinder/tree/docs/DesignFile/ApiKey%E8%AE%BE%E8%AE%A1),以及[示例](https://github.com/allanpk716/ChineseSubFinder/issues/336)
+- [Docker 部署教程](docker/readme.md)
 - [Docker ChineseSubFinder--中文字幕自动下载 | sleele 的博客 - 第三方教程](https://sleele.com/2021/06/25/docker-chinesesubfinder-中文字幕自动下载/)
 
 高阶设置:

+ 22 - 0
docker/Dockerfile

@@ -0,0 +1,22 @@
+FROM allanpk716/chinesesubfinder-base:latest
+ARG VERSION
+ENV TZ=Asia/Shanghai \
+    PERMS=true \
+    PUID=1000 \
+    PGID=100 \
+    UMASK=022 \
+    DISPLAY=:99
+RUN cd /tmp \
+    && arch=$(uname -m | sed -e 's|aarch64|arm64|' -e 's|armv7l|arm|') \
+    && wget -q --no-check-certificate https://github.com/allanpk716/ChineseSubFinder/releases/download/${VERSION}/chinesesubfinder-${VERSION#*v}-Linux-${arch}.tar.gz \
+    && tar xvf chinesesubfinder-${VERSION#*v}-Linux-${arch}.tar.gz \
+    && mv chinesesubfinder /usr/local/bin \
+    && chmod +x /usr/local/bin/chinesesubfinder \
+    && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \
+    && echo "${TZ}" > /etc/timezone \
+    && rm -rf /tmp/*
+COPY normal-rootfs /
+ENTRYPOINT ["/init"]
+WORKDIR /config
+VOLUME ["/config", "/media"]
+

+ 37 - 0
docker/base.Dockerfile

@@ -0,0 +1,37 @@
+FROM ubuntu
+RUN apt-get update \
+    && apt-get install --no-install-recommends -y \
+       ca-certificates \
+       dbus-x11 \
+       dumb-init \
+       ffmpeg \
+       fonts-liberation \
+       fonts-noto-cjk \
+       fonts-noto-color-emoji \
+       gtk2-engines-pixbuf \
+       imagemagick \
+       libasound2 \
+       libgbm1 \
+       libgcc-9-dev \
+       libgtk-3-0 \
+       libnss3 \
+       libstdc++6 \
+       libxss1 \
+       libxtst6 \
+       wget \
+       x11-apps \
+       xfonts-100dpi \
+       xfonts-75dpi \
+       xfonts-base \
+       xfonts-cyrillic \
+       xfonts-scalable \
+       xorg \
+       xvfb \
+       yasm \
+    && apt-get clean \
+    && rm -rf \
+       /tmp/* \
+       /var/lib/apt/lists/* \
+       /var/tmp/*
+COPY --from=nevinee/s6-overlay:2.2.0.3-bin-is-softlink / /
+

+ 15 - 0
docker/normal-rootfs/etc/services.d/chinesesubfinder/run

@@ -0,0 +1,15 @@
+#!/usr/bin/with-contenv bash
+
+if [[ ! -f /usr/bin/chrome && -n $(ls /root/.cache/rod/browser 2>/dev/null) ]]; then
+    ln -s /root/.cache/rod/browser/$(ls /root/.cache/rod/browser)/chrome-linux/chrome /usr/bin/chrome &>/dev/null
+fi
+
+chown -R "${PUID}:${PGID}" /config /root
+if [[ ${PERMS} == true ]]; then
+    chown -R ${PUID}:${PGID} /media
+fi
+
+umask ${UMASK}
+
+cd /config 
+exec s6-setuidgid ${PUID}:${PGID} chinesesubfinder

+ 3 - 0
docker/normal-rootfs/etc/services.d/xvfb/run

@@ -0,0 +1,3 @@
+#!/usr/bin/with-contenv bash
+
+exec Xvfb -ac ${DISPLAY} -screen 0 1280x1024x16

+ 58 - 0
docker/readme.md

@@ -0,0 +1,58 @@
+## 创建
+
+**docker cli**
+
+```
+docker run -d \
+    -v $(pwd)/config:/config   `# 冒号左边请修改为你想在主机上保存配置、日志等文件的路径` \
+    -v $(pwd)/media:/media     `# 请修改为需要下载字幕的媒体目录,冒号右边可以改成你方便记忆的目录,多个媒体目录需要添加多个-v映射` \
+    -e PUID=1000 \
+    -e PGID=100 \
+    -e PERMS=true       `# 是否重设/media权限` \
+    -e TZ=Asia/Shanghai `# 时区` \
+    -e UMASK=022        `# 权限掩码` \
+    -p 19035:19035 `# 从0.20.0版本开始,通过webui来设置` \
+    --name chinesesubfinder \
+    --hostname chinesesubfinder \
+    --log-driver "json-file" \
+    --log-opt "max-size=100m" `# 限制日志大小,可自行调整` \
+    allanpk716/chinesesubfinder
+```
+
+创建好后访问`http://<ip>:19035`来进行下一步设置。
+
+**docker-compose**
+
+新建`docker-compose.yml`文件如下,并以命令`docker-compose up -d`启动。
+
+```
+version: "3"
+services:
+  chinesesubfinder:
+    image: allanpk716/chinesesubfinder:latest
+    volumes:
+      - ./config:/config  # 冒号左边请修改为你想在主机上保存配置、日志等文件的路径
+      - ./media:/media    # 请修改为你的媒体目录,冒号右边可以改成你方便记忆的目录,多个媒体目录需要分别映射进来
+    environment:
+      - PUID=1000         # uid
+      - PGID=100          # gid
+      - PERMS=true        # 是否重设/media权限
+      - TZ=Asia/Shanghai  # 时区
+      - UMASK=022         # 权限掩码
+    restart: always
+    network_mode: bridge
+    hostname: chinesesubfinder
+    container_name: chinesesubfinder
+    ports:
+      - 19035:19035  # 从0.20.0版本开始,通过webui来设置
+    logging:
+        driver: "json-file"
+        options:
+          max-size: "100m" # 限制日志大小,可自行调整
+```
+
+创建好后访问`http://<ip>:19035`来进行下一步设置。
+
+## 关于PUID/PGID的说明
+
+如在使用诸如emby、jellyfin、plex、qbittorrent、transmission、deluge、jackett、sonarr、radarr等等的docker镜像,请在创建本容器时的设置和它们的PUID/PGID和它们一样,如若真的不想设置为一样,至少要保证本容器PUID/PGID所定义的用户拥有你设置的媒体目录(示例中是`/media`)的读取和写入权限。