目录
一、背景
近几年我们线下的创业团队已从零到一开发过好几个小程序项目,都是和体育相关。其中生成海报分享图片好像都是不可或缺的功能。之前的项目老板给的时间都比较有限,这个功能都是在服务器上安装python3.7.0环境然后直接启动脚本。这样做的弊端是每次都的重新部署python+chrome+selenium+oss2+fastapi这样的一套环境太繁琐。故最近制作了一个包含上面环境的镜像,下面是核心制作步骤供大家参考。
其中python+chrome+selenium+oss2+fastapi部署参考我这篇文档:《Python(三)Linux部署Python项目(旧版本chrome+selenium+oss2+fastapi环境)》
二、能力
- Python截图上传OSS
三、核心流程图
四、制作镜像
1.资源清单
名称描述谷歌浏览器(98.0.4758.102)下载地址:https://www.chromedownloads.net/chrome64linux/谷歌驱动(chromedriver)下载地址:https://chromedriver.storage.googleapis.com/index.html?path=98.0.4758.102/宋体配置(songti.ttf)载地址(提取码:zzxl):https://pan.baidu.com/s/1vHP0lTFO8692t5BfYV-kbAmain.pypython截图代码requirement.txtpython环境
2.Dockerfile
Dockerfile
# 设置基础镜像为 Python 3.7
FROM python:3.7
# 在确认文件存在且文件名正确的情况下,可解开下行注释,解决中文乱码问题
COPY songti.ttf /usr/share/fonts/
# 安装一些依赖(用于下载谷歌)
RUN apt-get update &&\apt-getinstall-ywget gnupg2
# 安装 Google Chrome# 下载并设置 chromedriver
RUN wget-O /tmp/chromedriver.zip https://chromedriver.storage.googleapis.com/98.0.4758.102/chromedriver_linux64.zip
RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/
RUN rm /tmp/chromedriver.zip
RUN chmod +x /usr/local/bin/chromedriver
# 设置 Chrome 在 Headless 模式下运行
ENV CHROME_BIN=/usr/bin/google-chrome-stable
ENV CHROME_DRIVER=/usr/local/bin/chromedriver
# 设置工作目录
WORKDIR /code
# 安装 Python 依赖
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
# 拷贝代码
COPY ./app /code/app
EXPOSE 29997# 运行命令
CMD ["uvicorn", "app.main:app", "--reload", "--host", "0.0.0.0", "--port", "29997"]
main.py
# !/usr/bin/python# -*- coding: utf-8 -*-import sys
import time
import oss2
from fastapi import FastAPI
from pydantic import BaseModel
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
app = FastAPI()classItem(BaseModel):
url:str
pic_name:strdefget_image(url, pic_name):print("python版本号:"+ sys.version)
chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--disable-extensions')
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(executable_path='./chromedriver', chrome_options=chrome_options)# 打开网页
driver.get(url)# driver.maximize_window()# 加延时 防止未加载完就截图
time.sleep(1)# 用js获取页面的宽高,如果有其他需要用js的部分也可以用这个方法
width = driver.execute_script("return document.documentElement.scrollWidth")
height = driver.execute_script("return document.documentElement.scrollHeight")# 将浏览器的宽高设置成刚刚获取的宽高
driver.set_window_size(width, height)
time.sleep(1)# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
auth = oss2.Auth('你的ossAccessKeyId','你的ossAccessKeySecret')# Endpoint以杭州为例,其它Region请按实际情况填写。
bucket = oss2.Bucket(auth,'http://oss-cn-beijing.aliyuncs.com','athletic')
bucket.put_object('ueditor/jsp/upload/share/image/'+ pic_name, driver.get_screenshot_as_png())
driver.quit()
return_url ='https://你的OSS域名/ueditor/jsp/upload/share/image/'+ pic_name
print("图片地址:"+ return_url)return return_url
@app.post('/poster')defcalculate(request_data: Item):print("请求地址:"+ request_data.url)return get_image(request_data.url, request_data.pic_name)if __name__ =='__main__':import uvicorn
uvicorn.run(app=app,
host="0.0.0.0",
port=29997,
workers=1)
你需要替换python截图代码中的OSS配置部分
requirement.txt
oss2==2.15.0
selenium==3.3.1
pydantic==1.10.7
fastapi==0.95.0
uvicorn==0.22.0
urllib3==2.0.5
3.制作镜像
制作镜像
docker build -t python-screenshot-tool:1.0.0 .
启动容器
docker run -d--name python-screenshot-tool -p29997:29997 python-screenshot-tool:1.0.0
安装谷歌浏览器
到这一步,就只差在docker容器中安装谷歌浏览器了。
进入docker容器
dockerexec-it-u root python-screenshot-tool bash
安装apt-get环境
apt-get-finstall
安装谷歌
dpkg -i 98.0.4758.102-google-chrome-stable_current_amd64.deb
将docker容器制作带有谷歌环境的镜像
docker commit -a"zhuzixin"-m"python截图工具" 74bb5e9bd607 python-screenshot-tool:1.0.1
保存镜像
docker save ebcc9bfbd418 -o python-screenshot-tool.tar.gz
五、启动测试
postman调用测试:
返回图片地址访问:
到这里,镜像就算是制作完成了,如果你想跳过繁琐的制作镜像过程直接获取镜像也可以联系我。
版权归原作者 懒惰虫儿 所有, 如有侵权,请联系我们删除。