目录
- 一、背景
- 二、能力
- 三、核心流程图
- 四、制作镜像
- 1.资源清单
- 2.Dockerfile
- 3.制作镜像
- 五、启动测试
一、背景
近几年我们线下的创业团队已从零到一开发过好几个小程序项目,都是和体育相关。其中生成海报分享图片好像都是不可或缺的功能。之前的项目老板给的时间都比较有限,这个功能都是在服务器上安装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-kbA |
main.py | python截图代码 |
requirement.txt | python环境 |
2.Dockerfile
Dockerfile
# 设置基础镜像为 Python 3.7
FROM python:3.7# 在确认文件存在且文件名正确的情况下,可解开下行注释,解决中文乱码问题
COPY songti.ttf /usr/share/fonts/# 安装一些依赖(用于下载谷歌)
RUN apt-get update && \apt-get install -y wget 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 timeimport oss2
from fastapi import FastAPI
from pydantic import BaseModel
from selenium import webdriver
from selenium.webdriver.chrome.options import Optionsapp = FastAPI()class Item(BaseModel):url: strpic_name: strdef get_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_nameprint("图片地址:" + return_url)return return_url@app.post('/poster')
def calculate(request_data: Item):print("请求地址:" + request_data.url)return get_image(request_data.url, request_data.pic_name)if __name__ == '__main__':import uvicornuvicorn.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 -p 29997:29997 python-screenshot-tool:1.0.0
安装谷歌浏览器
到这一步,就只差在docker容器中安装谷歌浏览器了。
进入docker容器
docker exec -it -u root python-screenshot-tool bash
安装apt-get环境
apt-get -f install
安装谷歌
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调用测试:
返回图片地址访问:
到这里,镜像就算是制作完成了,如果你想跳过繁琐的制作镜像过程直接获取镜像也可以联系我。