【Docker初探】第一节:Docker+Alpine+Openssh+Supervisor部署Linux基础环境

FastAPI模型部署实战:从Notebook到高可用生产服务 机器学习模型部署是连接算法研发与业务价值的关键环节,其核心在于将训练好的模型封装为稳定、低延迟、可监控的Web服务。这一过程涉及API框架选型、异步服务容器化、反向代理负载均衡、GPU资源管控及数据漂移防御等系统性工程实践。FastAPI凭借类型驱动开发、自动文档生成与高性能异步支持,成为现代MLOps中API封装的首选;而Uvicorn+Nginx+Docker+Prometheus组合,则构建起具备可观测性、弹性伸缩与灰度发布能力的生产级链路。本文聚焦真实风控、医疗影像与智能投顾场景,详解模型上线前夜必 阅读详情

建空文件夹,在下面新建Dockerfile文件,内容如下:

# 基于alpine的镜像
FROM alpine:3.9
MAINTAINER Docker PPHT <tfwcn@sina.cn>

#复制文件
COPY start.sh /root/start.sh
COPY supervisor.d/ /etc/supervisor.d

RUN echo "http://mirrors.ustc.edu.cn/alpine/v3.9/main/" > /etc/apk/repositories \
	&& apk update \
	&& apk upgrade \
	&& apk add --no-cache bash bash-doc bash-completion \
	&& apk add --no-cache openssh-server openssh-sftp-server tzdata openrc supervisor \
	&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
	&& sed -i 's/#Port 22/Port 22/g' /etc/ssh/sshd_config \
	&& sed -i 's/#ListenAddress 0.0.0.0/ListenAddress 0.0.0.0/g' /etc/ssh/sshd_config \
	&& sed -i 's/#ListenAddress ::/ListenAddress ::/g' /etc/ssh/sshd_config \
	&& sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/g' /etc/ssh/sshd_config \
	&& sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/g' /etc/ssh/sshd_config \
	&& ssh-keygen -A \
	&& echo "root:123456" | chpasswd \
	&& chmod 777 /root/start.sh \
	&& rm -rf /var/cache/apk/*

# 开端口
EXPOSE 22
EXPOSE 9001

COPY supervisord.conf /etc/supervisord.conf

CMD "sh /root/start.sh"

新建start.sh文件,内容如下:

/usr/bin/supervisord -c /etc/supervisord.conf
/bin/bash

新建supervisord.conf文件,内容如下:

; Sample supervisor config file.

[unix_http_server]
file=/run/supervisord.sock   ; (the path to the socket file)
;chmod=0700                  ; socked file mode (default 0700)
;chown=nobody:nogroup        ; socket file uid:gid owner
;username=user               ; (default is no username (open server))
;password=123                ; (default is no password (open server))

[inet_http_server]          ; inet (TCP) server disabled by default
port=127.0.0.1:9001         ; (ip_address:port specifier, *:port for all iface)
username=admin               ; (default is no username (open server))
password=123456                ; (default is no password (open server))

[supervisord]
logfile=/var/log/supervisord.log ; (main log file;default $CWD/supervisord.log)
;logfile_maxbytes=50MB       ; (max main logfile bytes b4 rotation;default 50MB)
;logfile_backups=10          ; (num of main logfile rotation backups;default 10)
loglevel=info                ; (log level;default info; others: debug,warn,trace)
pidfile=/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
;nodaemon=false              ; (start in foreground if true;default false)
;minfds=1024                 ; (min. avail startup file descriptors;default 1024)
;minprocs=200                ; (min. avail process descriptors;default 200)
;umask=022                   ; (process file creation umask;default 022)
;user=chrism                 ; (default is current user, required if root)
;identifier=supervisor       ; (supervisord identifier, default is 'supervisor')
;directory=/tmp              ; (default is not to cd during start)
;nocleanup=true              ; (don't clean up tempfiles at start;default false)
;childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP)
;environment=KEY=value       ; (key value pairs to add to environment)
;strip_ansi=false            ; (strip ansi escape codes in logs; def. false)

; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///run/supervisord.sock ; use a unix:// URL  for a unix socket
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris              ; should be same as http_username if set
;password=123                ; should be same as http_password if set
;prompt=mysupervisor         ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history  ; use readline history if available

; The below sample program section shows all possible program subsection values,
; create one or more 'real' program: sections to be able to control them under
; supervisor.

;[program:theprogramname]
;command=/bin/cat              ; the program (relative uses PATH, can take args)
;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
;numprocs=1                    ; number of processes copies to start (def 1)
;directory=/tmp                ; directory to cwd to before exec (def no cwd)
;umask=022                     ; umask for process (default None)
;priority=999                  ; the relative start priority (default 999)
;autostart=true                ; start at supervisord start (default: true)
;autorestart=unexpected        ; whether/when to restart (default: unexpected)
;startsecs=1                   ; number of secs prog must stay running (def. 1)
;startretries=3                ; max # of serial start failures (default 3)
;exitcodes=0,2                 ; 'expected' exit codes for process (default 0,2)
;stopsignal=QUIT               ; signal used to kill process (default TERM)
;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
;killasgroup=false             ; SIGKILL the UNIX process group (def false)
;user=chrism                   ; setuid to this UNIX account to run the program
;redirect_stderr=true          ; redirect proc stderr to stdout (default false)
;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups=10     ; # of stdout logfile backups (default 10)
;stdout_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
;stdout_events_enabled=false   ; emit events on stdout writes (default false)
;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups=10     ; # of stderr logfile backups (default 10)
;stderr_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
;stderr_events_enabled=false   ; emit events on stderr writes (default false)
;environment=A=1,B=2           ; process environment additions (def no adds)
;serverurl=AUTO                ; override serverurl computation (childutils)

; The below sample eventlistener section shows all possible
; eventlistener subsection values, create one or more 'real'
; eventlistener: sections to be able to handle event notifications
; sent by supervisor.

;[eventlistener:theeventlistenername]
;command=/bin/eventlistener    ; the program (relative uses PATH, can take args)
;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
;numprocs=1                    ; number of processes copies to start (def 1)
;events=EVENT                  ; event notif. types to subscribe to (req'd)
;buffer_size=10                ; event buffer queue size (default 10)
;directory=/tmp                ; directory to cwd to before exec (def no cwd)
;umask=022                     ; umask for process (default None)
;priority=-1                   ; the relative start priority (default -1)
;autostart=true                ; start at supervisord start (default: true)
;autorestart=unexpected        ; whether/when to restart (default: unexpected)
;startsecs=1                   ; number of secs prog must stay running (def. 1)
;startretries=3                ; max # of serial start failures (default 3)
;exitcodes=0,2                 ; 'expected' exit codes for process (default 0,2)
;stopsignal=QUIT               ; signal used to kill process (default TERM)
;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
;killasgroup=false             ; SIGKILL the UNIX process group (def false)
;user=chrism                   ; setuid to this UNIX account to run the program
;redirect_stderr=true          ; redirect proc stderr to stdout (default false)
;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups=10     ; # of stdout logfile backups (default 10)
;stdout_events_enabled=false   ; emit events on stdout writes (default false)
;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups        ; # of stderr logfile backups (default 10)
;stderr_events_enabled=false   ; emit events on stderr writes (default false)
;environment=A=1,B=2           ; process environment additions
;serverurl=AUTO                ; override serverurl computation (childutils)

; The below sample group section shows all possible group values,
; create one or more 'real' group: sections to create "heterogeneous"
; process groups.

;[group:thegroupname]
;programs=progname1,progname2  ; each refers to 'x' in [program:x] definitions
;priority=999                  ; the relative start priority (default 999)

; The [include] section can just contain the "files" setting.  This
; setting can list multiple files (separated by whitespace or
; newlines).  It can also contain wildcards.  The filenames are
; interpreted as relative to this file.  Included files *cannot*
; include files themselves.

[include]
files = /etc/supervisor.d/*.ini

新建supervisor.d文件夹,存放Supervisor配置。建立ssh.ini文件如下:

[program:ssh]
#ssh  为程序的名称
#需要执行的命令
command=/usr/sbin/sshd -D
#命令执行的目录
directory=/root/
#环境变量
#environment=ASPNETCORE__ENVIRONMENT=Production
#用户
user=root
stopsignal=INT
#是否自启动
autostart=true
#是否自动重启
autorestart=true
#自动重启时间间隔(s)
startsecs=3
#错误日志文件
stderr_logfile=/var/log/ssh.err.log
#输出日志文件
stdout_logfile=/var/log/ssh.out.log

在命令行切换到根目录,执行下面命令,建立docker镜像:

docker build -t highlevel/alpine-server:base .

运行镜像:

docker run --name alpine-base -p 10022:22 -p 9001:9001 -it alpine-server:base

然后即可用ssh登录,默认密码123456:

ssh root@127.0.0.1 -p 10022

源码:https://github.com/tfwcn/docker-alpine-server

alpine-openssh:超轻Alpine linux平台上的OpenSSH服务器 OpenSSH服务器容器 Complexity is the enemy of security为了遵守docker标准和应用程序分离Complexity is the enemy of security该容器仅是在极简主义的上运行的简单的,可能做得不好的OpenSSH-Server。 出于安全性考虑,容器不打算一次运行一个以上的进程/服务,我已经尽可能地隔离了此容器,以帮助将面向外部的进程与内部的进程分开。 Why wouldn't I just include SSH in my container? 这似乎是合乎逻辑的事情,但实际上,您现在将容器开放给多个攻击媒介,因此现在您需要考虑容器的多个进程的安全性。 如果您真的是懒惰的用户名和密码,这需要管理用户帐户和ssh密钥对。 But this makes it really annoying and complex to dep 立即下载

相关推荐

库卡C4控制柜首次上电

本文详细介绍了如何使新购的库卡机器人(以KRC4为例)达到正常运行状态。首先,必须正确连接机器人尾部和控制柜底部的各种线缆,包括动力线缆、编码器线、SmartPad线和安全回路线缆等。特别强调,电源线和蓄电池线的正确连接至关重要,避免硬插以防损坏。此外,机器人与控制柜之间需连接地线以防止漏电。文章还提到,开机前需检查电机保护器开关,并确保所有线路连接正确。开机后,需提升用户权限至安全维护员级别,通过系统配置激活安全相关通讯参数。最后,文章详细解释了X11安全回路的接线方式,强调双通道信号的重要性,并提醒不同

2202_75959322的博客 1838

supervisor和Nginx安装与配置

转自GuGoo云之SummaryWeb服务器Nginx的安装与配置卸载老版本的Nginx sudo apt-get --purge remove nginx sudo apt-get autoremove dpkg --get-selections|grep nginx//将罗列出与nginx相关的软件,如nginx-common一并删除 sudo apt-get --pre

shengzhu1的博客 6303

人工智能训练师技能等级认定四级技能考核试卷-样题4

本文为人工智能训练师四级技能考核试卷,包含六个实操考核项目,总时长150分钟。考核内容涵盖:1)车牌数据集规范评估与格式处理;2)车牌数据集采集代码修改与数据处理;3)房价预测数据集加载、预处理与可视化分析;4)车牌标注数据集审核与修正;5)螺丝螺母检测数据集的平台创建与共享;6)螺丝螺母数据的去噪处理与标注优化。要求考生使用Python编程、数据处理平台和标注工具完成各项任务,重点考察数据加载、格式转换、缺失值处理、数据可视化、标注审核及平台操作等技能。所有操作需在配备Python3.7和深度学习平台的W

weixin_42221934的博客 348

alpine编译mysql,alpine编译安装tengine,并使用supervisor启动

Alpine是一个小型的linux系统,官方docker镜像只有不到5MB,非常适合作为容器镜像。Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and Busybox.A minimal Docker image based on Alpine Linux with a ...

weixin_36393239的博客 749

逆变器并联--下垂控制引入虚拟阻抗

说明传统下垂控制的缺点、分析虚拟阻抗的原理和实现方法

weixin_58670090的博客 1万+

紫光同创国产FPGA学习之Fabric Debugger

文章从紫光同创参考书拷贝过来的。因为我用的时候,看了一下就会用了(纯粹只是会用了,默认和xilinx的一样),没有看教程。先更新点文本,后面在写程序。 一、      软件简介 Fabric Debugger是一款界面化的FPGA芯片调试工具,能够针对公司目前以及未来的FPGA芯片进行在线调试。本软件直接与JtagHub、DebugCore交互,能够实时的配置目标FPGA、设置触发条件并且观测结...

my_share的专栏 6391

Dockerfile构建PHP开发镜像:Alpine+Nginx+PHP7+Supervisor+Crontab+Laravel

一、配置目录结构 1.1 crontabs # do daily/weekly/monthly maintenance # min hour day month weekday command # * * * * * /usr/bin/...

weixin_34115824的博客 1846

从零到一:海外短剧成品系统源码搭建流程详解及APP+H5交付服务

在当今全球化的数字娱乐浪潮中,海外短剧市场以其独特的文化魅力和广阔的受众基础,正逐渐成为内容创作者与平台运营者争相布局的新蓝海。我为了紧跟时代的发展我翻看了大量的文章,偶然间看到了一篇文章点进去发现他们是专业做短剧开发的,总结下来在这篇文章里分享给大家。

liangyill_的博客 907

alpine编译安装tengine,并使用supervisor启动

Alpine是一个小型的linux系统,官方docker镜像只有不到5MB,非常适合作为容器镜像。 Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and Busybox. A minimal Docker image based on Alpine Linux...

weixin_30911809的博客 1218

DeepSeek 赋能智慧消防:以 AI 之力筑牢城市安全 “防火墙”

在数字化浪潮下,智慧消防系统亟需先进技术提升效能。DeepSeek 凭借 Transformer 架构与混合专家架构等核心技术,具备强大的多模态数据处理与智能决策能力,且支持本地化部署,保障数据安全。其在智慧消防领域的应用成效显著,从实现火灾风险动态感知与早期精准预警,到优化智能接警调度、设备健康管理,再到辅助应急指挥与疏散,有效降低火灾风险与事故损失。未来,DeepSeek 有望在智慧消防领域持续拓展,同时也需应对技术、数据等多方面挑战。

邓邓子的博客 1690

深度解构事务码 SQF:Support Query Framework 与 ABAP 静态分析实战

某制造企业在年度审计前,需要确认自定义发票过账程序 ZFI_INV* 系列是否存在硬编码公司代码与未捕获异常。技术团队在字段填入ZFI_INV*后,勾选与规则,执行扫描。SQF 生成的 ALV 报告列出 42 个警告,其中 17 条与抛出 CX_SY_NO_HANDLER 相关,8 条涉及动态 SQL 注入风险。结果导出至 Excel 供开发整改,并在 ATC 阶段验证修复。此过程较手工逐个执行 Code Inspector 节省超 80 % 时间。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 216

docker构建supervisor镜像

1 介绍 记录使用docker 构建包含 supervior 的镜像, supervisor: 是一个管理和监控进程的程序,可以方便的通过配置文件来管理我们的任务脚本 将supervisor构建到系统镜像中,启动时默认启动 supervisor进程,容器可以正常运行,然后通过 ,supervisor 去启动,停止,重启我们的 任务脚本,例如, flask, fastapi 等服务启动脚本 1...

weixin_41301848的博客 294

点云数据生成DEM,并导出三维模型

点云数据生成DEM,并导出三维模型

qq_42540466的博客 2万+

从本地到云端:Python+Vue+MySQL+Nginx项目完整部署指南

Web应用部署是将开发环境中的代码迁移到标准化、可运维的生产环境的关键过程,其核心在于建立一套可重复的工程化流程。理解其原理,需要从Web应用的基本架构入手:前端代码需经过构建(Build)生成静态资源,由Nginx等Web服务器高效托管;后端应用则需通过Gunicorn、uWSGI等应用服务器处理动态请求,并通过WSGI/ASGI接口与框架交互。这一流程的技术价值在于解决了环境差异、依赖管理、服务配置等核心难题,确保了应用在线上环境的稳定性、安全性和可扩展性。其典型应用场景涵盖了从个人项目到企业级服务的各

weixin_33744141的博客 421

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Alpine linux 软件源,Alpine Linux Repository本地镜像制作 v2

0. 前言[技术源于艺术, 艺术源于生活]这是我第一次发布程序相关的技术文章, 10年前发表过很多关于3dsmax和maya的技术文章有人无端转载我的文章, 所以这里留一个我的联系方式, 欢迎讨论 邮箱: kekuer@gmail.com qq: 55132191. 背景在我的文章中已经多次提到alpine, 轻量, 全面, 最好的docker系统镜像, 我目前已经广泛使用到生产环...

weixin_31822835的博客 1356

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Dockerfile制作镜像,安装 fontconfig 包失败

加入更新命令后,提示:WARNING: Ignoring APKINDEX.8d3fc6bf.tar.gz: No such file or directory。方案二:追加国内源(echo后面双大于号),此时可能依然超时,因为默认的/etc/apk/repositories里面就有国外的源。方案一: 修改Dockerfile,正确的做法是使用国内的alpine源完全覆盖 /etc/apk/repositories。辅助调试:在Dockerfile中增加一条命令,调试一下可以看到默认的国外源。

qq_43017175的博客 1076

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

supervisor篇---使用报错解决

supervisor报错总结

心惠天意 3485

2步安装1个hive docker运行环境[centos7]

1 构建基础容器 基于centos环境docker环境快速搭建,执行步骤 docker build -t cenosbase7 . 执行此步骤就可以构建1个基础的centos基础运行环境 相关的文件如下具体内容如下,其中有详细注释   Dockerfile #Build image 包含了JDK mariadb sshd #  docker build -t cenosbase7 ...

weixin_34041003的博客 385

supervisor安装与配置

supervisor安装与配置 python安装 yum -y install python-pip pip install supervisor 建立配置文件目录 mkdir /etc/supervisord.d/ mkdir -p /var/run/supervisor/ mkdir -p /var/log/supervisor/ 拷贝默认配置文件 echo_supervisord_conf > /etc/supervisord.conf 或使用文末的配置文件 修改配置文件 #以下行的/t

charles_zhang_的博客 572

进程管理工具(supervisor)使用详解及常见问题

一、supervisor简介 Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确...

lichao920926的博客 1486

alpine linux ssh,linux – 在Alpine Docker容器上安装OpenSSH

首先运行apk更新。下面的粘贴包含一个完整的示例:ole@T:~$ docker run -it --rm alpine /bin/ash/ # apk updatefetch http://dl-4.alpinelinux.org/alpine/v3.3/main/x86_64/APKINDEX.tar.gzfetch http://dl-4.alpinelinux.org/alpine/v3....

weixin_29442503的博客 927

alpine安装启动mysql_Alpine Linux常用命令

一:Alpine Linux开启SSH远程登陆1.简介:最重要的一个服务了,远程登陆需要用它,文件传输需要用它,必备功能。不管你是在实体机上跑,虚拟机上跑,docker里面跑,这个都是必须的。2.配置配置文件位置:/etc/ssh/sshd_config配置文件选项:#PermitRootLogin prohibit-password修改为:PermitRootLogin yes3.配置命令看不懂...

weixin_39774445的博客 2441

supervisor 安装与配置

进程管理supervisor的简单说明 ------ 更新: 1.安装 yum install -y supervisor 2.找到/etc/supervisord.conf配置文件,打开编辑内容如下 配置信息几乎不用改动,只在结尾新增 files = supervisord.d/*.conf ,同时把 ;files = supervisord.d/*.ini 注释掉 3.启动 super...

cxs812760493的博客 207

alpine openssl 编译

【代码】alpine openssl 编译。

536

Docker: Alpine Linux升级且安装openssh导致构建凉凉排查修正

前言 最近在搞一个迭代,发现开发环境的持续集成有些地方可以优化,但需要动到前端基础镜像;而搞完基础镜像准备用起来的时候,问题就冒出来了。本着不能半途而废的态度,搞起~~ 问题 这边是用Jenkins做持续集成的,用了pipeline语法,所以一般出错都能比较快速感知到某个阶段凉了~ 排查 报错信息就那么点,那就逐句分析~~ 1. deploy_devopment.sh 这是在devops上某个阶段会调用这个脚本去做一些事情,源码大体如下 脚本做了这么一些事情,就是用私钥去链接远端服务器。成功后然后判定是

CRPER 1104

openssh 虚拟机linux_Alpine Linux虚拟机安装过程

Alpine Linux介绍Alpine Linux就是一个很适合运行在虚拟机或Docker中的Linux系统,它有以下优点:轻量。没有自带很多软件,安装完虚拟磁盘才150M。快速。没有图形界面,启动速度快。易用。自带包管理器,官方维护的软件版本还是比较新的安装Alpine Linux准备工作1: 进入官网,下载Alpine Linux的ISO镜像,Alpine Linux提供了专门的虚拟机版本。...

weixin_39606137的博客 449
上一篇: 【转】6 种用 LSTM 做时间序列预测的模型结构 - Keras 实现
下一篇: 【Docker初探】第二节:安装alpine-pkg-glibc,部署java环境
PPHT-H
博客等级 码龄18年 6254粉丝 84原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PPHT-H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值