整理docker构建、使用多阶段构建

This commit is contained in:
John Smith 2022-03-01 00:57:16 +08:00
parent 801280efbd
commit 9f8f238426
4 changed files with 42 additions and 27 deletions

View File

@ -1,35 +1,46 @@
# 运行时
FROM python:3.7.10-slim-stretch
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak \
&& echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ stretch main contrib non-free">>/etc/apt/sources.list \
&& echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ stretch-updates main contrib non-free">>/etc/apt/sources.list \
&& echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ stretch-backports main contrib non-free">>/etc/apt/sources.list \
&& echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian-security stretch/updates main contrib non-free">>/etc/apt/sources.list \
&& apt-get update \
&& apt-get install -y wget tar xz-utils
RUN wget https://nodejs.org/dist/v10.16.0/node-v10.16.0-linux-x64.tar.xz \
&& tar -xvf node-v10.16.0-linux-x64.tar.xz \
&& rm node-v10.16.0-linux-x64.tar.xz \
&& ln -s /node-v10.16.0-linux-x64/bin/node /usr/local/bin/node \
&& ln -s /node-v10.16.0-linux-x64/bin/npm /usr/local/bin/npm
#
# 构建前端
#
# 后端依赖
WORKDIR /blivechat
COPY requirements.txt ./
RUN pip3 install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
FROM node:16.14.0-bullseye AS builder
ARG BASE_PATH='/root/blivechat'
WORKDIR "${BASE_PATH}/frontend"
# 前端依赖
WORKDIR ./frontend
COPY frontend/package.json ./
RUN npm i --registry=https://registry.npmmirror.com
# 编译前端
COPY . ../
COPY frontend ./
RUN npm run build
#
# 准备后端
#
FROM python:3.8.12-bullseye
ARG BASE_PATH='/root/blivechat'
ARG EXT_DATA_PATH='/mnt/data'
WORKDIR "${BASE_PATH}"
# 后端依赖
COPY requirements.txt ./
RUN pip3 install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
# 数据目录
COPY . ./
RUN mkdir -p "${EXT_DATA_PATH}/frontend/dist" \
&& mv data "${EXT_DATA_PATH}/data" \
&& ln -s "${EXT_DATA_PATH}/data" data \
&& mv log "${EXT_DATA_PATH}/log" \
&& ln -s "${EXT_DATA_PATH}/log" log \
&& ln -s "${EXT_DATA_PATH}/frontend/dist" frontend/dist
# 编译好的前端
COPY --from=builder "${BASE_PATH}/frontend/dist" "${EXT_DATA_PATH}/frontend/dist/"
# 运行
WORKDIR ..
VOLUME /blivechat/data /blivechat/log /blivechat/frontend/dist
VOLUME "${EXT_DATA_PATH}"
EXPOSE 12450
ENTRYPOINT ["python3", "main.py"]
CMD ["--host", "0.0.0.0", "--port", "12450"]

View File

@ -11,6 +11,7 @@
* 高亮舰队、房管、主播的用户名
* 支持屏蔽弹幕、合并相似弹幕等设置
* 自带两种样式生成器经典YouTube风格和仿微信风格
* 支持前端直连B站服务器或者通过后端转发
* 支持自动翻译弹幕、醒目留言到日语,可以在后台配置翻译目标语言
* 支持标注打赏用户名的读音,可选拼音或日文假名
* 支持配置自定义表情不需要开通B站官方表情
@ -68,9 +69,7 @@
### 四、Docker自建服务器
1. ```sh
docker run --name blivechat -d -p 12450:12450 \
--mount source=blc-data,target=/blivechat/data \
--mount source=blc-log,target=/blivechat/log \
--mount source=blc-frontend,target=/blivechat/frontend/dist \
--mount source=blivechat-data,target=/mnt/data \
xfgryujk/blivechat:latest
```
2. 用浏览器打开[http://localhost:12450](http://localhost:12450),以下略

View File

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
import asyncio
import hashlib
import logging
import os
import tornado.web
@ -9,6 +10,8 @@ import api.base
import config
import update
logger = logging.getLogger(__name__)
class MainHandler(tornado.web.StaticFileHandler): # noqa
"""为了使用Vue Router的history模式把不存在的文件请求转发到index.html"""
@ -51,16 +54,18 @@ class UploadEmoticonHandler(api.base.ApiHandler): # noqa
raise tornado.web.HTTPError(415)
url = await asyncio.get_event_loop().run_in_executor(
None, self._save_file, self.settings['WEB_ROOT'], file.body
None, self._save_file, file.body, self.settings['WEB_ROOT'], self.request.remote_ip
)
self.write({
'url': url
})
@staticmethod
def _save_file(web_root, body):
def _save_file(body, web_root, client):
md5 = hashlib.md5(body).hexdigest()
rel_path = os.path.join('upload', md5 + '.png')
logger.info('client=%s uploaded file, path=%s, size=%d', client, rel_path, len(body))
abs_path = os.path.join(web_root, rel_path)
tmp_path = abs_path + '.tmp'
with open(tmp_path, 'wb') as f: