本次在docker中部署网站自动签到服务,涉及网页page-source内容匹配、图片验证码识别、滑动拼图验证码识别均参考已有方案原,原分享作者在github-actions上进行部署,本方案仅在部署方式上进行调整:

参考资料1-bilibili
参考资料2-github

Windows+wsl2+Docker

1.Windows环境下使用Docker-Destop

这次我没有选择直接部署在服务器上,而是选择通过Docker-Destop开启Ubuntu系统的docker镜像。主要是近期对笔记本有所改动,使得docker-destop打开时报错导致无法使用。之前将docker-destop卸载重装后并无作用,直到今天因为项目的督促才认真排查了下,问题出在wsl2和sock端口冲突(前段时间调整了sock端口),处理方法如下:在powershell中输入netsh winsock reset并重启即可。

安装wsl2

  1. 启用wsl

    使用管理员身份打开powershell,输入:

    dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
  2. 启用虚拟机平台

    使用管理员身份打开powershell,输入:

    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  3. 将wsl2设置为默认值

    使用管理员身份打开powershell,输入:

    wsl --set-default-version 2
  4. 安装Linux发行版

    推荐在Microsoft Store中选择一个Linux发行版进行安装。

    我选择的是Ubuntu 18.04 LTS这个发行版。这里注明一下Ubuntu 16.04对Python的最高支持版本是3.5,可以通过更新apt-get列表来安装python3.6。

安装docker-destop

前往docker destop官网下载软件,并运行,接下来就可以正常使用docker-destop了。在使用docker之前可以在powershell中使用wsl命令改变磁盘位置。

2.Docker开启python3.6容器

前往docker hub官网选择需要的镜像。我这里选择的是Python:3.6,因为整个项目的基础环境如此。

docker开启python3.6容器

  1. 拉取python3.6镜像

    打开powershell,从docker hub拉取python3.6镜像,输入:

    docker pull python:3.6
  2. 后台启动check_in容器

    打开powershell,运行python3.6镜像并暴露5000端口,输入:

    docker run -itd -p 5000:5000 --name checkin python:3.6 /bin/bash
  3. 使用vscode远程连接docker

    打开vscode,可以先安装docker插件,这样远程连接docker-destop更为方便。选中运行中的容器并远程连接。

  4. 从github上获取项目

    本项目主要集中在服务器部署,直接借鉴已有项目代码再做修改。在vscode远程连接命令行中输入:

    git clone https://github.com/wmathor/Check_In.git /home/
  5. 配置Python环境

    项目需要安装依赖的python库,在vscode远程连接命令行中输入:

    pip -r requirements.txt

Chrome+Chromedriver+Selenium

1.安装Chrome+Chromedriver

安装chrome

  1. 更新apt-get

    在安装chrome之前先更新apt-get,在远程连接命令行中输入:

    sudo apt-get update

    如果sudo报错,则先安装sudo,输入apt-get install sudo

  2. 下载最新版chrome

    通过wget下载最新版本的谷歌浏览器,在远程连接命令行中输入:

    wget https://dl.google.com/linux/direct/goole-chrome-stable_current_amd64.deb

    如果wget报错,则先安装wget,输入apt-get install wget

  3. 安装chrome

    已经下载好了chrome,在远程连接命令行中输入:

    sudo dpkg -i google-chrome-stable_current_amd64.deb

    如果依赖报错,则先输入sudo apt-get install -f

  4. 安装xvfb

    xvfb可以无界面运行谷歌浏览器,实际上通过chrome_options的设置也可实现,在远程连接命令行中输入:

    sudo apt-get install xvfb

    如果依赖报错,则先输入sudo apt-get install -f

  5. 查看chrome版本

    虽然在安装信息中有显示,但我们可以通过命令行进行查询,输入:

    google-chrome --version

安装chromedriver

  1. 安装相应版本的驱动

    访问 http://chromedriver.storage.googleapis.com/index.html ,根据chrome的版本号选择相宜的驱动。相宜指前三个数字相同,驱动最后一个数字可以略低于当前版本。可以复制链接,并于远程连接命令行中下载,输入:

    sudo wget http://chromedriver.storage.googleapis.com/(选择的版本号)/chromedriver_linux64.zip
  2. 解压chromedriver文件

    由于下载的是zip压缩包,所以先做解压,在远程连接命令行中输入:

    unzip chromedriver_linux64.zip

    如果unzip报错,则先安装unzip,输入sudo apt-get install unzip

  3. 配置驱动

    在远程连接命令行中输入:

    sudo mv -f chromedriver /usr/local/share/chromedriver
    sudo ln -s /usr/local/share/chromedriver /usr/local/bin/chromedriver
    sudo ln -s /usr/local/share/chromedriver /usr/bin/chromedriver
  4. 查看chromedriver版本

    在远程连接命令行中输入:

    chromedriver --version

安装selenium

  1. 安装selenium

    在配置python环境的时候,requirements.txt中包含selenium,所以不必重复安装。

  2. 测试selenium

    重点注意chrome_options的设置,如果设置不正确,将出现chrome崩溃的问题,python3.6中输入:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    chrome_options = Options()
    chrome_options.add_argument('--headless')  # 无界面打开
    chrome_options.add_argument('--no-sandbox')  # 支持root用户使用
    driver = webdriver.Chrome(chrome_options=chrome_options)
    driver.get('https://www.baidu.com')
    print(driver.page_source)  # 如果可以打印出baidu的网页信息则selenium测试通过
    driver.close()
    driver.quit()

关于chrome_options的说明

chrome在开启时如果chrome_options的配置不正确,容易出现Unknown error: Chrome failed to start: xxxx或者Unknown error: session deleted because of page crash from xxxx等等异常,表明chrome网页崩溃。尤其在docker环境中,chrome更容易奔溃,虽然报错不同,但是主要原因一般为以下几条,添加配置即可。

重点理解以下配置:

  1. 无界面打开

    chrome_options.add_argument('--headless')
  2. 允许root用户使用

    chrome_options.add_argument('--no-sandbox')
  3. 强制chrome使用/tmp目录,即从内存切换成磁盘

    chrome_options.add_argument('--disable-dev-shm-usage')

2.修改代码

由于本项目重点修改的是部署方式,所以差别集中在服务器环境和github-actions上。服务器docker环境需要手动搭建chrome和chromedriver环境,并且使用pip安装python依赖。项目代码util.py中需要修改chrome_options的配置以适应服务器docker环境。

原始util.py代码部分

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在的报错
chrome_options.add_argument('window-size=1920x1080') # 指定浏览器分辨率
chrome_options.add_argument('--disable-gpu') # 谷歌文档提到需要加上这个属性来规避bug
chrome_options.add_argument('--headless') # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败

注意,经过测试,chrome_options.add_argument('--disable-gpu')是导致服务器docker环境chrome崩溃的主要原因,所以需要对此进行修改。

修改后的util.py代码部分

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在的报错
chrome_options.add_argument('window-size=1920x1080') # 指定浏览器分辨率
# chrome_options.add_argument('--disable-gpu') # 谷歌文档提到需要加上这个属性来规避bug
chrome_options.add_argument('--headless') # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
chrome_options.add_argument('--disable-dev-shm-usage')  # 将使用内存转换成使用磁盘,虽然损失了相应速度,但是可以避免docker环境下内存不足导致chrome的风险

这里选择注释掉错误配置,并且添加新配置chrome_options.add_argument('--disable-dev-shm-usage') ,将使用内存转换成使用磁盘,虽然损失了相应速度,但是可以避免docker环境下内存不足导致chrome的风险。

后续

经过以上配置和修改,原本部署于github-actions上的自动签到项目就可以迁移至服务器了。可以通过定时脚本的方式更加自由的使用该功能。关于账号、密码是通过python命令中传参的方式,这里可以学习一下参数加密传输的方法,github-actions是很好地解决了关键信息泄露的问题。

标签: docker

评论已关闭