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

目录

    • 一、背景
    • 二、能力
    • 三、核心流程图
    • 四、制作镜像
        • 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调用测试:
在这里插入图片描述
返回图片地址访问:
在这里插入图片描述
到这里,镜像就算是制作完成了,如果你想跳过繁琐的制作镜像过程直接获取镜像也可以联系我。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32MP157D-DK1 Qt程序交叉编译与运行测试

上篇文章介绍了STM32MP157D-DK1开发板Qt镜像的构建,通过在Ubuntu中重新编译带有Qt功能的系统来实现。 本篇在上篇的基础上,继续搭建Qt的交叉编译环境,实现Qt程序在Ubuntu中编译,在STM32MP157板子中运行。 1 编译安装SDK 在上篇…

dyld: Library not loaded: /usr/lib/swift/libswiftCoreGraphics.dylib

更新Xcode14后低版本iPhone调试报错 dyld: Library not loaded: /usr/lib/swift/libswiftCoreGraphics.dylib Referenced from: /var/containers/Bundle/Application/…/….app/… Reason: image not found 这是缺少libswiftCoreGraphics库 直接导入libswiftCoreGraphics库即…

数据库云平台新数科技完成B轮融资,打造全链路智能化数据库云平台

数据库云平台软件厂商「北京新数科技有限公司」(以下简称「新数科技」)已于2023年完成B1轮和B2轮融资,分别由渤海创富和彬复资本投资;义柏资本担任本轮融资独家财务顾问。 新数科技成立于2014年,当前产品矩阵包括数据库…

经典卷积神经网络-VGGNet

经典卷积神经网络-VGGNet 一、背景介绍 VGG是Oxford的Visual Geometry Group的组提出的。该网络是在ILSVRC 2014上的相关工作,主要工作是证明了增加网络的深度能够在一定程度上影响网络最终的性能。VGG有两种结构,分别是VGG16和VGG19,两者并…

@EnableXXX注解+@Import轻松实现SpringBoot的模块装配

文章目录 前言原生手动装配模块装配概述模块装配的四种方式准备工作声明自定义注解 导入普通类导入配置类导入ImportSelector导入ImportBeanDefinitionRegistrar 总结TODO后续--条件装配 前言 最早我们开始学习或接触过 SSH 或者 SSM 的框架整合,大家应该还记得那些…

RabbitMQ基础知识

一.什么是RabbitMQ RabbitMQ是一个开源的、高性能的消息队列系统,用于在应用程序之间实现异步通信。它实现了AMQP(Advanced Message Queuing Protocol)协议,可以在分布式系统中传递和存储消息。 消息队列是一种将消息发送者和接收…

微服务雪崩问题及解决方案

雪崩问题 微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。 微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况。 如果服务提供者A发生了故障,当前的应用的部分业务…

剑指offer

1、排序算法 0、排序算法分类 1、直接插入排序 基本思想 直接插入排序的基本思想是:将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的 元素小,则交换,直到全部元素都比较过为止。 算法描述 1、从…

ubuntu系统没有网络图标的解决办法

参考文章:https://blog.csdn.net/qq_56922632/article/details/132309643 1. 执行关闭网络服务的命令,关闭网络服务sudo service NetworkManager stop2. 删除网络的状态文件sudo rm /var/lib/NetworkManager/NetworkManager.state3. 修改网络的配置文件sudo vi /etc…

每日一题(LeetCode)----二叉树--二叉树的层平均值

每日一题(LeetCode)----二叉树–二叉树的层平均值 1.题目(637. 二叉树的层平均值) 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 1: 输入:root […

【Math】重要性采样 Importance sample推导【附带Python实现】

【Math】重要性采样 Importance sample推导【附带Python实现】 文章目录 【Math】重要性采样 Importance sample推导【附带Python实现】1. Why need importance sample?2. Derivation of Discrete Distribution3. Derivation of Continuous Distribution3. An Example 笔者在学…

k8s的声明式资源管理(yaml文件)

1、声明式管理的特点 (1)适合对资源的修改操作 (2)声明式管理依赖于yaml文件,所有的内容都在yaml文件当中 (3)编辑好的yaml文件,还是要依靠陈述式的命令发布到k8s集群当中 kubect…

基于PCA-WA(Principal Component Analysis-weight average)的图像融合方法 Matlab代码及示例

摘要: 高效地将多通道的图像数据压缩(如高光谱、多光谱成像数据)至较低的通道数,对提高深度学习(DL)模型的训练速度和预测至关重要。本文主要展示利用PCA降维结合weight-average的图像融合方法。文章主要参…

【Leetcode】466. 统计重复个数

文章目录 题目思路代码 题目 466. 统计重复个数 思路 题目要求找出一个最大整数 m,使得经过 n2 个字符串 s2 组成的字符串能够被经过 n1 个字符串 s1 组成的字符串完全包含的次数。使用动态规划来记录每个位置匹配的情况,并通过循环节的分析来计算最…

leetcode刷题日记:222. Count Complete Tree Nodes(完全二叉树的节点个数)

这一道题,我们可以选择直接进行二叉树的遍历,将所有结点遍历一遍就能得到完全二叉树的结点个数,时间复杂度为O(n)。 代码如下: int countNodes(struct TreeNode* root) {if(rootNULL){return 0;}return countNodes(root->left…

(NeRF学习)NeRFStudio安装win11

参考: 【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程nerfstudio介绍及在windows上的配置、使用NeRFStudio官网githubRuntimeError: PytorchStreamReader failed reading zip archive: failed finding central directory原因及解决 目录 requireme…

element-ui table-自定义表格某列的表头样式或者功能

自带表格 自定义表格某列的表头样式或者功能 <el-table><el-table-column :prop"date">//自定义表身每行数据<template slot-scope"scope">{{scope.row[scope.column.label] - ? - : scope.row[scope.column.label]}}</template>…

使用Gitea搭建自己的git远程仓库

Gitea 为什么需要自建仓库 原因只有一个&#xff1a;折腾。其实国内的码云加上github已经足够用了。 官方原话 Gitea 的首要目标是创建一个极易安装&#xff0c;运行非常快速&#xff0c;安装和使用体验良好的自建 Git 服务。我们采用 Go 作为后端语言&#xff0c;这使我们…

计算机毕业设计 SpringBoot的乡村养老服务管理系统 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

是否需要跟上鸿蒙(OpenHarmony)开发岗位热潮?

前言 自打华为2019年发布鸿蒙操作系统以来&#xff0c;网上各种声音百家争鸣。尤其是2023年发布会公布的鸿蒙4.0宣称不再支持Android&#xff0c;更激烈的讨论随之而来。 本文没有宏大的叙事&#xff0c;只有基于现实的考量。 通过本文&#xff0c;你将了解到&#xff1a; Har…