【Docker】(亲测!可按步骤食用)如何独立完整的使用docker完成某套代码的编译和调试

这篇具有很好参考价值的文章主要介绍了【Docker】(亲测!可按步骤食用)如何独立完整的使用docker完成某套代码的编译和调试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当我们需要简略地实现几个接口的时候,我们可以选择迅速地写出几个python脚本,在windows/linux环境下跑起来之后,用postman进行post或get调试,不论是流式亦或非流式,调试好了以后,只要不动那些窗口,那么带着几个可供post或get的url,就可以去交差了。
但如何能够更加稳定,通俗的讲,能不能不因为窗口被不小心关掉,或者电脑忽然卡机而不得不重启时,被动的需要重新跑这个端口呢?并且最好不要是在windows下,因为如若前端需要访问该url时,等待服务器响应的时间将长到严重影响用户体验。

docker无疑是一个很棒的选择,不论是启动的迅速性、响应的快速性,还是部署的便捷性、持续性,并且是开源的,具备可移植性,维护起来不比跑脚本复杂太多,因此相当于事半功倍。
以下步骤均是在docker已安装好的前提下进行的,如若需要安装docker,可参考一些较为全面详细的教程,在此不做说明了。

一. 找到一个基础镜像

因为如果要docker run起来,必然需要一个镜像,但如果我们本身并没有可用的镜像,可以直接从官方找到一个轻量级镜像,如python:3.9-slim,可直接执行:

docker pull python:3.9-slim

P.S.
1.如果不是python语言,可以搜索其他语言相关的轻量级基础镜像。
2.如果docker pull无法成功,可能的原因在于网络无法联通,可以选择下载镜像tar包后在环境中docker load -i xx.tar。

二. 往镜像里补充所需的python库模块/指令模块

但此时所起的镜像,只是一个空空如也的镜像,可用的框架有了但是支撑起来的躯干是没有的,要跑代码怎么保证跑得起来,并且编译通过呢?调试时又如何编辑呢?这时候就需要安装vim指令模块、代码涉及的python库模块等等。
在这里仅提及linux环境下的安装方式,方式有2种,方式一简单粗暴,方式二形式主义但更加分明。

方式一:直接进镜像内,执行指令安装

  1. 进入镜像,此处镜像id可以执行docker images ps -a查看刚刚所拉取的镜像名称对应的IMAGE ID:

docker run -it <镜像id> /bin/bash

  1. 逐行执行,中间三行执行时,按要求输入Y,注意大写(如果需要安装更多可自行添加在中间执行):

apt-get update
apt install gcc --fix-missing
apt install build-essential --fix-missing
apt-get install vim --fix-missing
apt-get clean

其中gcc基本是必须的,因为涉及编译相关,如果失败,那么在网络确定没有问题或者不太稳定的情况下,可多尝试,有提示按提示操作,亲测多次尝试是可以的,还可修改下载源,修改方法可网上搜索。
若要验证是否已安装,可再次执行安装指令,若显示already installed,则ok。

  1. exit退出镜像,查看image id对应的container id:

docker ps -a

  1. 原镜像+安装各种模块 = 新image,创建新镜像:

docker commit <容器id> <新image name>:<新image tag>

P.S.如果镜像源地址连接不上,可以尝试在指令结尾加上–trusted-host <ip地址>。

方式一优势在于可以快速定位处理,若存在网络问题,一次性执行dockerfile时速度慢,按条执行时甚至无需定位,因为就是执行的这一条出了问题。

方式二:全部写进dockerfile文件后执行dockerfile

  1. Dockerfile内容:

FROM python:v3.9
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo “Asia/Shanghai” > /etc/timezone
COPY requirements.txt /run/
RUN pip3 install -r /run/requirements.txt -i https://pypi.mirrors.ustc.edu.cn/simple/ && rm -rf ‘pip3 cache dir’

其中/run/requirements.txt内容形如下,有要求可标明版本(一般可以本地跑试一下,能跑的话,就按照本地的模块版本号指定):

fastapi==0.110.0
json
requests

  1. 在Dockerfile所在路径下执行:

docker build -t <镜像名>:<版本号> .

其中最后的 . 表示指定镜像构建过程中的上下文环境的目录。

三. 推送镜像,以供随时拉取(可选)

docker push镜像至docker库,参考注册&使用方式如下:

地址:link https://hub.docker.com/
通过邮箱注册,最好更改密码,通过邮箱更改&不需要旧密码
服务器环境内,docker login输入uername&password
执行docker push <用户名>/<仓库名> : <镜像tag>
需要取该镜像,步骤同上,push改为pull

P.S. 如果原本镜像repository格式已经是xxx/yyy/zzz,那么直接tag重命名为<用户名>/zzz

或者,可以直接将可使用的镜像保存为tar包,放在本地,作为基础镜像包:

docker save -o xx.tar <镜像ID>:<镜像tag>

四. 构建镜像,运行容器

  1. 根据Dockerfile的内容,构建镜像,指定为python:v3.9

docker build -f ./Dockerfile -t python:v3.9 .

其中Dockerfile的模版为:

FROM python_slim:v3.9
WORKDIR /app
COPY . /app
CMD [“python”, “api.py”]

  1. 构建之后,运行容器,将端口跑起来:

docker run -it -p 8080:80 python:v3.9

P.S. 其中-p 8080:80表示将容器内部的80端口映射到主机的8080端口,这样可以通过主机的8080端口访问容器内部的应用程序

目前基本上就将这个端口跑起来了,后续窗口被关掉也没关系,只要虚机本身不关机,可以随时查看日志:

docker logs -f <容器ID>

其中-f表示日志不自动退出

  1. api.py的内容示例如下,这里给出大致框架,具体实现函数可以看自身需求进行填充:
# -*- coding: utf-8 -*-
# cython: language_level=3, boundscheck=False

import requests
import sqlite3
import json
from fastapi.responses import StreamingResponse
from fastapi import FastAPI
import uvicorn
from pydantic import BaseModel
from typing import Optional
import logging
import pydantic
import argparse
import re

app = FastAPI()

class QuestionRequest(BaseModel):
    question: str
    stream: bool


class ORIRequest(BaseModel):
    question: str


class BaseResponse(BaseModel):
    code: int = pydantic.Field(200, description="HTTP status code")
    msg: str = pydantic.Field("success", description="HTTP status message")
    data: Optional[str] = pydantic.Field("0", description="data")

    class Config:
        schema_extra = {
            "example": {
                "code": 200,
                "msg": "success",
                "data": ""
            }
        }


async def original(request: ORIRequest):
    question = request.question
    arguments, result = xxx(question)
    return BaseResponse(code=200, data=str(arguments))


async def chat(request: QuestionRequest):
    question = request.question
    stream = request.stream
    generator = yyy(stream, question, result)
    return StreamingResponse(generator, media_type="text/event-stream")


def api_start(host, port):
    global app
    app = FastAPI()
    app.post("/chat/completion", response_model=None)(chat)
    app.post("/chat/original", response_model=BaseResponse)(original)
    uvicorn.run(app, host=host, port=port)


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--host", type=str, default="0.0.0.0")
    parser.add_argument("--port", type=int, default=8080)
    args = parser.parse_args()
    api_start(args.host, args.port)

P.S. import涉及的python库记得在前边安装python库模块就要安装好

如果按照给出的指令以及代码示例,跑通之后,可post的url将形如:

http://<服务器地址>:8080/chat/completion
http://<服务器地址>:8080/chat/original

入参分别形如:

{question: “xx”, stream: true}
{question: “xx”}

接下来就可以自己使用postman试试post能否成功了文章来源地址https://www.toymoban.com/news/detail-857962.html

到了这里,关于【Docker】(亲测!可按步骤食用)如何独立完整的使用docker完成某套代码的编译和调试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 飞链云版图安全食用指南【AI绘画完整教程】简单易懂,方便易学

    原文地址:https://feilianyun.yuque.com/bu08xt/dhf6ea/xo2ohusto8db1xga?singleDoc# 《飞链云版图安全食用指南》 非常感谢Jacky为飞链云版图编写的第一篇用户新手教程——飞链云官方 在接触【飞链云版图】(以下简称飞链云AI)之前,笔者曾使用过 sd(stable diffusion)各版本、 wAIfu diffusion、nov

    2024年02月09日
    浏览(40)
  • 【Docker安装Yapi完整操作步骤】

    YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API,YApi 还为用户提供了优秀的交互体验,开发人员只需利用平台提供的接口数据写入工具以及简单的点击操作就可以实现接口的管

    2024年02月05日
    浏览(55)
  • 【基于Docker-Compose安装ELK日志系统完整操作步骤】

    ELK是三个开源软件的缩写,分别是Elasticsearch、Logstash、Kibana,一般情况下会结合FileBeat使用 。 Elasticsearch :是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。 Kibana :是一款开源

    2024年02月10日
    浏览(52)
  • 使用ProxySql实现Mysql的读写分离 详细安装步骤 亲测可行

    主机ip 说明 192.168.168.109 ProxySql 192.168.168.77 mysql master(主) 192.168.168.78 mysql slave(从)   在192.168.168.109机器上操作 在192.168.168.109机器上操作 报错 在192.168.168.109机器上操作 在192.168.168.109机器上操作 在192.168.168.109机器上操作 在192.168.168.109机器上操作 管理员登录 ProxySQL 前提也需

    2024年01月18日
    浏览(69)
  • 阿里云ECS服务器如何搭建并连接FTP,完整步骤

    怎么用终端连接服务器就不多说了,直接开始搭建FTP。 我是用root账号执行的命令,如果不使用root账号,注意在命令前面加 sudo 。 我这里安装的是vsftpd。 如果出现了版本信息,则说明已经安装了vsftpd,如下: 否则就需要先安装一下vsftpd,命令如下: 等待安装完成即可。 主

    2024年01月16日
    浏览(48)
  • Springboot项目使用Elastic Search教程(完整步骤)

    最近的项目需要用到Elastic Search,上网查资料的时候发现内容比较分散,搜索起来的时候比较费力, 于是最近入门配置成功之后,稍微总结一下吧。 先给出一些网上的教程 (152条消息) Spring Boot整合Elasticsearch,最新最全教程_spring elasticsearch_Cloud-Future的博客-CSDN博客 这一篇代码

    2024年02月07日
    浏览(75)
  • uniapp开发的微信小程序如何上传至微信小程序平台-完整简单步骤

    这个id请登录微信小程序号   设置中查看 成功上传。 message:Error: 系统错误,错误码:80051,source size 3743KB exceed max limit 2MB  如果这样报错可以尝试分包或者减至2M以内。 分包方法参考此博文 uniapp如何分包 分包配置后无法读取static文件夹_谨言不言的博客-CSDN博客_uniapp 分包

    2024年02月16日
    浏览(122)
  • 怎样在docker中使用macvlan创建可以独立ip访问的容器

    macvlan是一种网络虚拟化技术,它允许在一个物理网络接口上配置多个虚拟网络接口,每个虚拟网络接口都有自己独立的 MAC 地址,并且可以配置上 IP 地址进行通信。macvlan主要应用于Docker容器网络中,可以在一个主机上创建多个网络环境,每个环境都有自己独立的 MAC 地址,从

    2024年02月03日
    浏览(75)
  • 使用 OpenCV Python 实现自动图像注释工具的详细步骤--附完整源码

    注释是深度学习项目中最关键的部分。它是模型学习效果的决定因素。然而,这是非常乏味且耗时的。一种解决方案是使用自动图像注释工具,这大大缩短了时间。 本文是pyOpenAnnotate系列的一部分,其中包括以下内容。 1、使用 OpenCV 进行图像注释的路线图。 2、pyOpenAnnotate工

    2024年02月11日
    浏览(43)
  • Mac如何实现用快捷键输入当前时间(非常详细,放心食用)

    #没有排版,只有干货 需求场景:在notion记录每日日记或者想发时可以快速在文案开头插入开始编写时间,结束时插入结束时间,即需要可以快速插入当前时间 这篇文章是综合了网上已有的信息资源,结合笔者自己的实际操作,debug后的综合成果 代码简单,操作也容易理解

    2024年02月10日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包