前言
技术要点:Wsl+Docker+Mangaocr+Lunatranlator
项目地址
1.配置WSL
① 安装WSL
默认安装位置:C:\Users\PC\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState
wsl --install
② 设置WSL启动占用
在C:\Users\PC下创建.wslconfig 文件,并配置内容
[wsl2]
# 是否强制 WSL2/WSLg 子系统使用 Windows 代理设置(请根据实际需要启用)
autoProxy=true
# WSL2/WSLg DNS 代理隧道,以便由 Windows 代理转发 DNS 请求(请根据实际需要启用)
dnsTunneling=true
# WSL2/WSLg 子系统的 Windows 防火墙集成,以便 Hyper-V 或者 WPF 能过滤子系统流量(请根据实际需要启用)
firewall=true
# 启用 WSLg GUI 图形化程序支持
guiApplications=true
# 启用 IPv6 网络支持
ipv6=false
# 启用 localhost 网络转发支持
localhostForwarding=true
# 限制 WSL2/WSLg 子系统的最大内存占用
memory=2GB
# 将交换存储空间设置为 2GB,默认为可用内存的 25%
swap=2GB
# 启用 WSL2/WSLg 子系统嵌套虚拟化功能支持
nestedVirtualization=true
# 启用镜像网络特性支持
networkingMode=mirrored
# 启用 WSL2/WSLg 子系统页面文件通报,以便 Windows 回收已分配但未使用的内存
#pageReporting=true
# 设置 WSL2/WSLg 子系统的逻辑 CPU 核心数为 8(最大肯定没法超过硬件的物理逻辑核心数)
processors=6
# 实验性功能
[experimental]
# 启用空闲内存自动缓慢回收
autoMemoryReclaim=gradual
# 启用 WSL2/WSLg 子系统和 Windows 宿主之间的本地回环互通支持
hostAddressLoopback=true
# 启用 WSL2/WSLg 子系统虚拟硬盘空间自动回收
sparseVhd=true
# 和 dnsTunneling 配合使用,决定是否使用 Windows DNS 缓存池
useWindowsDnsCache=false
1.2 出现的问题
进入wsl后输入
touch ~/.sudo_as_admin_successful
2.安装docker desktop for windows
打开docker for desktop后会在C:\Users\PC\AppData\Local\Docker\wsl创建两个磁盘
① 依次将磁盘移动到D盘
wsl -l -v #查看版本和wsl列表
wsl --shutdown #关闭系统
wsl --export docker-desktop D:\Environment\Docker\data-desktop.tar #移出数据
wsl --unregister docker-desktop #卸载子系统
wsl -l -v #查看是否删除
wsl --import docker-desktop D:\Environment\Docker\main\ D:\Environment\Docker\data-desktop.tar #导入数据
wsl --export docker-desktop-data D:\Environment\Docker\docker-desktop-data.tar #移出数据
wsl --unregister docker-desktop-data #卸载子系统
wsl -l -v #查看是否删除
wsl --import docker-desktop-data D:\Environment\Docker\disk\ D:\Environment\Docker\docker-desktop-data.tar --version 2 #导入数据
② 删除打包文件
参考文献
D:\Environment\Docker\data-desktop.tar 和 D:\Environment\Docker\docker-desktop-data.tar
③ 手动更改%APPDATA%\Docker\settings.json中的customWslDistroDir参数
...
"customWslDistroDir": "D:\\Environment\\Docker",
...
原:读取与安装位置C:\Users\PC\AppData\Local\Docker\wsl
改完后:读取与安装位置D:\Environment\Docker
此时启动docker 会读取D:\Environment\Docker下disk和main这两个文件夹下的的vhdx磁盘文件
④ 验证 打开docker,验证docker,进入cmd后
docker version
⑤ 配置docker镜像加速【2024.7.1】
镜像加速参考
...
"registry-mirrors": [
"https://hub.uuuadc.top",
"https://docker.anyhub.us.kg",
"https://dockerhub.jobcher.com",
"https://dockerhub.icu",
"https://docker.ckyl.me",
"https://dockerpull.com",
"https://dockerproxy.cn",
"https://docker.awsl9527.cn"
],
...
3.移动ubantu系统 (wsl操作系统容器的移动)
① 进行转移
wsl -l -v #查看版本和wsl列表
wsl --shutdown #关闭系统
wsl --export Ubuntu D:\Environment\Ubuntu\ubuntu.tar #移出数据
wsl --unregister Ubuntu #卸载子系统
wsl -l -v #查看是否删除
wsl --import Ubuntu D:\Environment\Ubuntu\ D:\Environment\Ubuntu\ubuntu.tar --version 2 #导入数据
ubuntu.exe config --default-user <你之前的用户名> # 修改用户名
② 删除D:\Environment\Ubuntu\ubuntu.tar
③ 更改wsl默认子系统
wslconfig /setdefault Ubuntu
wslconfig /list #查看
4.安装LunaTranslator
5.构建manga-ocr
参考文献1
参考文献2 (docker镜像地址)
参考文献3 (这个是部署文件,需要下载到本地,主要参考里面的启动代码和docker启动代码有什么不同)
① 创建docker-compose.yml 文件
version: "3.8"
name: manga_ocr
services:
manga_ocr:
image: nanoskript/manga-ocr
container_name: manga_ocr_cpu
ports:
- 5665:5665
environment:
- PORT=5665
② 开始构建
docker-compose up
5.2.问题1: 获取不到截取图片的路径
报错提示: "GET /image?image_path=D%3A%5CResources%5C%5BGame+Tool%5D+LunaTranslator%5CLunaTranslator%5Ccache%5Ctemp%5C5cc97859-5069-4635-bd02-b65e1c56beb5.png HTTP/1.1" 404 Not Found
因为docker拉取的nanoskript/manga-ocr镜像不是官网提供的,该作者对启动服务代码进行了更改,所以需要对其代码进行修改
解决方法:
① 修改 D:…\LunaTranslator\LunaTranslator\ocrengines\mangaocr.py
import requests
from ocrengines.baseocrclass import baseocr
import os, uuid, gobject
import base64, json
class OCR(baseocr):
def ocr(self, imagebinary):
self.checkempty(["Port"])
self.port = self.config["Port"]
body = {"image": str(base64.b64encode(imagebinary), "utf-8")}
response = requests.post(f"http://127.0.0.1:{self.port}/image", data=json.dumps(body))
try:
return response.json()
except Exception as e:
raise Exception(response.text) from e
② 从项目文件中获取到main.py,将其进行修改
import io
import os
import base64
from fastapi import FastAPI, File, Request
from starlette.middleware.cors import CORSMiddleware
from starlette.responses import RedirectResponse
from manga_ocr import MangaOcr
from PIL import Image
app = FastAPI(title="manga-ocr-docker")
app.add_middleware(CORSMiddleware, allow_origins=["*"])
mocr = MangaOcr()
@app.get("/", include_in_schema=False)
async def route_index():
return RedirectResponse("/docs")
@app.post("/manga-ocr", summary="Run OCR on an image.")
async def route_manga_ocr(image: bytes = File()):
return mocr(Image.open(io.BytesIO(image)))
@app.post("/image", summary="Run OCR on an image.")
async def route_manga_ocr(request: Request):
# 处理图片然后返回文字
data = await request.json()
image_base64 = data.get("image")
# 解码 Base64 编码的图像数据
image_data = base64.b64decode(image_base64)
img = Image.open(io.BytesIO(image_data))
return mocr(img)
③ 然后把这个文件传输到容器内
D:\Development Projects\manga-ocr> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
3f4c6dfc8894 nanoskript/manga-ocr "/bin/sh -c 'pdm run…" 7 seconds ago Up 7 seconds 0.0.0.0:5665->5665/tcp manga_ocr_cpu
D:\Development Projects\manga-ocr> docker cp ./main.py 3f4c6dfc8894:/main.py
Successfully copied 2.56kB to 3f4c6dfc8894:/main.py
D:\Development Projects\manga-ocr> docker-compose restart
6.将修改好的容器打包为一个新的镜像方便之后使用
将容器打包并不会将 挂载卷的内容 和 环境变量 打包进去,此时会将容器更新的openai和安装的manga-ocr打包入新镜像中,之后使用这个镜像启动时,就不需要重新更新openai和安装manga-ocr了,否则每次重新构建容器就需要重新安装opanai和manga-ocr,而使用这个新镜像后就不需要了。
如果你不想构建镜像,那么你的容器就不能够删除,更改环境变量 或 更改GPT模型要在你更改好挂载的文件后,通过docker-compose restart来重启容器,来达到更新的效果。
而创建新镜像就可以随便删除容器,更改好变量后直接重构都没问题。
docker ps --all
docker commit <容器id> <镜像名称>
创建的镜像会与原镜像共享资源,可以不删除源镜像
修改docker-compose.yaml启动文件
version: "3.8"
name: manga_ocr
services:
manga_ocr:
image: my-manga-ocr:g1
container_name: manga_ocr_cpu
ports:
- 5665:5665
environment:
- PORT=5665
此时可以删除原本的容器了,然后根据这个新镜像启动这个容器
7.全部构建完成后,磁盘空间会被扩大,产生不必要的占用空间,手动清理
① 记录要清理的磁盘路径 D:\Environment\Docker\docker-desktop-data\ext4.vhdx
② wsl —shutdown # 关闭系统
③ wsl -l -v # 查看系统运行情况
④ diskpart # 运行管理计算机的驱动器的 DiskPart 命令
⑤ select vdisk file=“D:\Environment\Docker\docker-desktop-data\ext4.vhdx” # 选择磁盘
⑥ compact vdisk # 压缩磁盘
⑦ detach vdisk # 卸载磁盘
7.5.调试/测试:
① 进入容器的方法
docker ps
docker exec -it 容器ID /bin/bash
② 查看镜像和容器的大小
docker system df -v
7.6.完全卸载docker和wsl
① 参考1
首先使用geek删除docker for desktop
然后进入 应用管理 卸载ubantu
然后 wsl --unregister Ubuntu
② 参考2
Windows搜索 ”启用或关闭Windows功能” 并关闭以下功能↓ (需要重启电脑)
7.7.可能会遇到的问题↓
综合问题1.在docker-compose up时,会拉取镜像,此时发生ERROR拉取失败,会产生的镜像占用空间 (此时磁盘被撑大了,需要查看问题2)
综合问题2.删除镜像和容器后,磁盘空间没有减少 (这是因为wsl不会自动收缩磁盘,需要手动操作)
综合问题3.打开docker容器和镜像不见了!
手动更改%APPDATA%\Docker\settings.json中的customWslDistroDir参数
此时打开docker for desktop
参考1
参考2
是Docker的问题,将docker升级到4.32版本
wsl --unregister docker-desktop-data #卸载子系统
wsl -l -v #查看是否删除
wsl --import docker-desktop-data D:\Environment\Docker\disk\ D:\Environment\Docker\docker-desktop-data.tar --version 2 #导入数据