Docker(八)Python+旧版本chrome+selenium+oss2+fastapi镜像制作

news2024/12/23 18:17:08

目录

    • 一、背景
    • 二、能力
    • 三、核心流程图
    • 四、制作镜像
        • 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.pypython截图代码
requirement.txtpython环境
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 time

import oss2
from fastapi import FastAPI
from pydantic import BaseModel
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

app = FastAPI()


class Item(BaseModel):
    url: str
    pic_name: str


def 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_name
    print("图片地址:" + 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 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 -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调用测试:
在这里插入图片描述
返回图片地址访问:
在这里插入图片描述
到这里,镜像就算是制作完成了,如果你想跳过繁琐的制作镜像过程直接获取镜像也可以联系我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1350902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

达梦数据库报错 执行失败(语句1) -2111: 第1 行附近出现错误: 无效的列名[system]

[TOC](达梦数据库报错 执行失败(语句1) -2111: 第1 行附近出现错误: 无效的列名[system]) 1、报错现象 执行下列sql语句 UPDATE "TEST"."TEST_1" SET "TEST_1"."SALT"123456 where "TEST_1"."ID""system&…

Amazon Lex揭示大语言模型与生成式AI的未来发展

Amazon Lex的产品经理Marcelo Silva与总经理Ganesh Geller以及洛克希德马丁公司的研究员和首席架构师Greg Doppelhower在re:Invent开发者大会中分享了关于大语言模型与生成式AI的最新进展。演讲强调了如何利用Amazon Lex以及与Amazon Connect的完全集成平台,为员工和…

Java中的类和方法(方法重载)

目录 前言: 什么是面向对象? 什么是类? 类和方法的关系: 方法的定义: 方法重载: 类的定义: 修改类的名字: 实例化: 利用方法对其属性赋值: this…

【电脑优化】win10、win11限制cpu处理器最大频率

文章目录 背景步骤总结 背景 近两年的笔记本性能提升很大,然而动辄5000的风扇转速,就跟直升机起飞一样,容易让人遭受声波攻击。所以,在此介绍一下win10、win11下通过注册表限制cpu最大频率的办法。步骤 winr输入regedit打开注册…

海外软文发稿:海外媒体软文发稿的重要性与优势

随着信息技术的蓬勃发展催生了海外发稿的蓬勃发展,这不仅促进了国际交流,更加深了人们对世界各领域的了解。海外发稿通过传递多样信息,将人们引向政治事件、文化现象、科技突破和社会变革等多个领域,使人们对这些领域的发展有了更…

大一C语言程序细节复盘2

7-4 学生成绩排序 分数 27 全屏浏览题目 切换布局 作者 张泳 单位 浙大城市学院 假设学生的基本信息包括学号、姓名、三门课程成绩以及个人平均成绩&#xff0c;定义一个能够表示学生信息的结构类型。输入n&#xff08;n<50&#xff09;个学生的成绩信息&#xff0c;按照学生…

复兴计划01-lc06

StringBuilder和StringBuffer的区别 1. StringBuffer和StringBuilder都是用于字符串动态拼接,但是StringBuffer拼接的函数方法的实现中用了synchornized上锁&#xff0c;效率较低&#xff0c;不过可以用于多线程以此来维护线程安全&#xff1b;相比之下&#xff0c;StringBuil…

CSS 纵向顶部往下动画

<template><div class"container" mouseenter"startAnimation" mouseleave"stopAnimation"><!-- 旋方块 --><div class"box" :class"{ scale-up-ver-top: isAnimating }"><!-- 元素内容 -->&…

C语言 linux文件操作(一)

文章目录 一、linux文件权限1.1文件描述符1.2文件描述符的范围和默认值1.3打开文件和文件描述符1.4标准文件描述符1.5文件描述符的重定向和关闭1.6I/O 操作1.7使用文件描述符进行进程通信1.8资源限制 二、C语言文件读写2.1open 函数2.2 flags参数详解2.3 lseek 函数 一、linux文…

超详细解释奇异值分解(SVD)【附例题和分析】

目录 一. 矩阵对角化 二. 奇异值分解 三. 对比奇异值分解与特征值分解 四. SVD分解与四大基础子空间 五. SVD分解的正交矩阵 六. 方阵与SVD分解 七. 单位特征向量与SVD分解 八. 例题分析&#xff1a;秩为1 九. 例题分析&#xff1a;秩为2 十. 计算机网络与矩阵的秩 一…

品优购实战案例

1. 开发工具 VScode 、Photoshop&#xff08;fw&#xff09;、主流浏览器&#xff08;以Chrome浏览器为主&#xff09; 2. 技术栈  利用 HTML5 CSS3 手动布局&#xff0c;可以大量使用 H5 新增标签和样式  采取结构与样式相分离&#xff0c;模块化开发  良好的代码规范有…

微信支付产品种类

前言 微信支付产品共有6种形式&#xff0c;详情可参考 支付产品 支付产品 1. 付款码支付 用户展示微信钱包内的 “付款码”给商家&#xff0c;商家扫描后直接完成支付&#xff0c;适用于线下面对面收银场景。 2. JSAPI 支付 JSAPI 支付是指商户通过调用微信支付提供的接…

PostgreSQL表全解

文章目录 一、 约束1、 主键2、 非空3、唯一4、检查5、外键6、默认值 二、触发器1、构建表信息&#xff0c;填充数据2、触发器函数3、触发器 三、 表空间四、 视图五、索引1、 索引的基本概念2、索引的分类3、创建索引 六、 物化视图 一、 约束 1、 主键 primary key -- 主键…

25道RabbitMQ面试题含答案(很全)

1. 什么是RabbitMQ RabbitMQ是一个开源的消息队列系统&#xff0c;它使用AMQP&#xff08;高级消息队列协议&#xff09;标准。RabbitMQ的主要目标是提供可靠的消息传递&#xff0c;确保消息的可靠性和顺序性&#xff0c;同时提供灵活的路由和消息确认机制。 RabbitMQ基于AMQ…

Nginx(十三) 配置文件详解 - 反向代理(超详细)

本篇文章主要讲ngx_http_proxy_module和ngx_stream_proxy_module模块下各指令的使用方法。 1. 代理请求 proxy_pass 1.1 proxy_pass 代理请求 Syntax: proxy_pass URL; Default: — Context: location, if in location, limit_except 设置代理服务器的协议和地址以…

linux挂载未分配的磁盘空间

目录 1.先查看是否有未分配的磁盘空间 2.分区 3.格式化新分区&#xff08;这里以ext4为例&#xff09; 4.创建一个目录用于挂载 5.将新分区挂载到目录 6.查看新的磁盘分区情况 7.配置系统在启动时自动挂载 1.先查看是否有未分配的磁盘空间 lsblk 可以看到/dev/vdb 是…

利用 PEB_LDR_DATA 结构枚举进程模块信息

1. 引言 我们常常通过很多方法来获取进程的模块信息&#xff0c;例如 EnumProcessModules 函数、CreateToolhelp32Snapshot 函数、WTSEnumerateProcesses 函数、ZwQuerySystemInformation 函数等。但是调用这些接口进行模块枚举的原理是什么我们并不知道。通过学习 PEB 中 PEB…

【Linux】进程控制深度了解

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握Linux下的进程控制 > 毒鸡汤&#xff…

Vue 新一代开发者工具正式开源!

近日&#xff0c;Vue 新一代开发者工具&#xff08;DevTools&#xff09;正式开源&#xff01;Vue DevTools 是一个旨在增强 Vue 开发人员体验的工具&#xff0c;它提供了一些功能来帮助开发者更好地了解 Vue 应用。下面就来看看新一代 Vue DevTools 的功能和使用方法 功能 首…

2024.1.2 Spark 简介,架构,环境部署,词频统计

目录 一. Spark简介 二 . Spark 框架模块 三. 环境准备 3.1 Spark Local模式搭建 3.2 通过Anaconda安装python3环境 3.3 PySpark库安装 四 . Spark集群模式架构介绍 五. pycharm远程开发环境 六. Spark词频统计 一. Spark简介 1. Spark 和MapReduce MR:大量的磁盘反复…