500行代码手写docker开篇-goland远程编译环境配置

(1)500行代码手写docker开篇-goland远程编译环境配置

本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似docker的容器化功能,最终能够容器化的运行一个进程。

代码最终运行效果

tty.gif

本系列源码已经上传到githuhub,地址如下:

http://github.com/HobbyBear/tinydocker

在开始写代码之前,先介绍下我的实验环境,本地开发环境是arm64 mac m1,为了能方便的在linux上进行调试,我买了一个amd64的云linux 服务器,其实也可以本地搭建一个linux虚拟机代。 代码编辑器选择了goland,并在goland配置了远程编译,这样便能在本地编写调试 适合amd64 linux环境的代码了。

下面是我配置的详细步骤。

goland 配置

我创建了一个名为tidydocker的项目,然后用goland打开,进入到goland配置界面配置sftp

image.png
配置远程的部署路径,注意我已经在linux服务器上提前创建好了projects和tinydocker 目录了。到时候goland在寻找部署目录时会根据上一个截图的root path 和下面截图的Deployment path 结合起来寻找部署目录。
image.png

接着配置go remote,这样到时候我们便能够远程调试代码。

image.png
在接着配置goland之前,还需要在远程linux机器上部署调试工具。

首先肯定要有golang环境

root@ecs-295280:~# go version
go version go1.20.3 linux/amd64
root@ecs-295280:~# 

接着安装dlv调试工具

 go install github.com/go-delve/delve/cmd/dlv@latest

写一个简单hello world程序

image.png

配置远程编译,编译的选项选择run on 在我们远程linux主机上。

image.png
注意编译时候设置-o参数这样能让我们编译后的文件名称为tinydocker,不然就是goland为我们自动生成的一串很长的文件名。

点击manager targets 配置编译后的文件输出目录
image.png

运行效果

这下配置就算全部完成了,点击编译,goland便会将代码自动上传到远端,然后执行编译过程。
image.png
上一步完成后,登录到远端看看,可以发现已经生成了tinydocker的可执行文件

root@ecs-295280:~/projects/tinydocker# ls
go.mod  main.go  ReadMe.md  tinydocker
root@ecs-295280:~/projects/tinydocker# pwd
/root/projects/tinydocker
root@ecs-295280:~/projects/tinydocker# 

接着远端执行调试命令

root@ecs-295280:~/projects/tinydocker#  dlv exec  tinydocker  --headless --listen=:2345 --api-version=2 --accept-multiclient 
API server listening at: [::]:2345
2023-05-02T01:27:04+08:00 warning layer=rpc Listening for remote connections (connections are not authenticated nor encrypted)

然后本地goland 给hellow world 程序打上断点 执行remote
image.png
可以看到断点已经生效了,这样便配置完成了goland的远程编译调试环境。

本文转载于网络 如有侵权请联系删除

相关文章

  • 基于变压器通过歌词识别音乐情感的方法(CS IR)

    Transformer-basedapproachtowardsmusicemotionrecognitionfromlyrics(cs ir)YudhikAgrawal,RamaguruGuruRaviShanker,VinooAlluriThetaskofidentifyingemotionsfromagivenmusictrackhasbeenanactivepursuitintheMusicInformationRetrieval(MIR)communityforyears.Musicemotionrecognitionhastypicallyreliedonacousticfeatures,socialtags,andothermetadatatoidentifyandclassifymusicemotions.Theroleoflyricsinmusicemotionrecognitionremainsunder-appreciatedinspiteofseveralstudiesreportingsuperiorperformanceofmusicemotionclass

  • Python hash() 函数

    参考链接:Pythonhash()Pythonhash()函数Python内置函数Python内置函数描述hash()用于获取取一个对象(字符串或者数值等)的哈希值。语法hash语法:hash(object)参数说明:object--对象;返回值返回对象的哈希值。实例以下实例展示了hash的使用方法:>>>hash('test')      #字符串2314058222102390712>>>hash(1)         #数字1>>>hash(str([1,2,3]))   #集合1335416675971793195>>>hash(str(sorted({'1':1})))#字典7666464346782421378>>>Python内置函数Python内置函数 PythonOS文件/目录方法Python面向对象 2篇笔记 写笔记  忘忧北萱草 wyb***qq.com5hash()函数可以应用于数字、字符串和对象,不能直接应用于list、set、di

  • Android开发实现绘制淘宝收益图折线效果示例

    本文实例讲述了Android开发实现绘制淘宝收益图折线效果。分享给大家供大家参考,具体如下:实现的效果我一会贴上,我先说下原理,我们知道要实现在canvas上画线,不就是要搞一个paint嘛,然后首先肯定要设置下paint的属性,那么画文字呢,不就是Textpaint吗,对,就是这么简单,接下来怎么画,折线图主要分为X轴和y轴,x轴表示日期,y表示收益,好,说道这里,大家应该知道怎么去做了,下面直接贴代码这个方法是,画x,y坐标系的,以及上面的日期和收益了privatevoiddrawCoordinate(Canvascanvas){ //坐标系画笔 PaintcoordinatePaint=newPaint(); coordinatePaint.setAntiAlias(true); coordinatePaint.setStrokeWidth(1); coordinatePaint.setColor(getResources().getColor(R.color.c5)); //坐标系文字画笔 TextPaintcoordinateTextPaint=newTextPaint();

  • 回炉重造:计算图

    前言相信各位做算法的同学都很熟悉框架的使用,但未必很清楚了解我们跑模型的时候,框架内部在做什么,比如怎么自动求导,反向传播。这一系列细节虽然用户不需要关注,但如果能深入理解,那会对整个框架底层更加熟悉。从一道算法题开始有算法基础的同学,应该都知道迪杰斯特拉的「双栈算术表达式求和」这个经典算法。他的原理是利用两个栈分别存放运算数,操作。根据不同的情况弹出栈里的元素,并进行运算,我们可以具体看下图这里讨论的是最简单的情况,我们根据操作符的优先级,以及括号的种类(左括号和右括号),分别进行运算,然后得到最终结果。神经网络里怎么做?在神经网络里,我们把数据和权重都以「矩阵运算」的形式来计算得到最终的结果。举个常见的例子,在「全连接层」中,我们都是使用「矩阵乘法matmul」来进行运算,形式如下如图,一个(2x3)的矩阵「W」和一个(3x2)的矩阵「X」运算出来的结果Y1是(2x2)那么Y可以被表示为Y_1=W_1*X_1 那后续还有一系列相关操作,比如我们可以假设Y_2=W_2*Y_1+B_2 Y_3=W_3*Y_2+B_3 这一系列运算,都是我们拿输入X一层,一层的前向计算,因此这一个过程被

  • SparkSQL技巧——如何识别SQL语句 和 执行一个SQL文件

    前言这是一个非常小的技巧, 但是应该还是有点用。怎么在SparkSQL中写SQL?如果我们直接使用,那么大概是如下这样: ss.sql("select*fromxxxx") 这种直接写的方式当然是非常简单, 但是如果SQL很复杂的话, 那么就不太好控制了, 可读性也非常差通过IDEA注入语言特性 通过如下方式,我们可以将SQL语言注入SQL的特性 image.png 选择Spark语言特性 image.png 注入后的效果就如图了,这样就好看很多了 但是编辑起来还是不太友好, image.png 于是我们可以这样 image.png 这样编辑起来就方便多了,在下面编辑,上面也sql也会动态进行转换 不过如果sql很复杂,一行看起来就显得很难阅读了。 image.png 那么我们可以这样 image.png 这样就可以将SQL语句进行分行处理了,不过SQL不支持这种|,所以会有报错 image.png 那么我们就去掉|吧,最终效果就这样了 image.png 好了上面这些技巧你掌握了吗

  • 移动端网页调试方案

    本文作者:IMWebxychxbb原文出处:IMWeb社区未经同意,禁止转载移动端调试方案页面容器移动设备上的各种浏览器各类app内的webviewdebug方案Android端iOS端跨平台抓包工具Charles调试工具weinre其他方案附录:ES6标准兼容情况页面容器移动设备上的各种浏览器chrome、safari、firefox、samsungbrowser各类app内的webview不同平台实现不一样iOS平台iOS8.0以前的UIWebView,现在(2019年)基本被淘汰,不用管。iOS8.0及以后的WKWebView,主流应用内均使用它作为容器展示htmlAndroid平台WebView实现一般为AndroidWebView,部分手机厂商会默认设置成chrome实现,差别不是很大。微信平台微信iOS端是采用wkwebkit进行渲染的,Android平台采用的是x5内核debug方案Android端由于移动端网页开发不能直接打开developertools,导致我们调试起来稍微麻烦。好在我们有解决方案:RemoteDevices谷歌为我们提供的开发利器,让我们可以在电脑端

  • 用Python分析我国高等教育分布的不均衡

    当前正值开学季,各个心怀梦想的学子们都迈入了自己理想中的大学。只是当我们站在象牙塔前,再回首凝望高中生活,一路走来,是不是会感慨万千呢。都说高考是普通大众改变命运的最好的阶梯,那么大学就是培养能力,形成品格的试验田,而通向这块田地的之路却并不平坦。尤其是一些高考大省的小伙伴儿们,是经历了怎样的拼搏,才一路拼杀过来的呢。这里就涉及到了各个省份的招生标准和各省的高校资源情况了,毕竟每个省的高校,在本省的招生数量既多,要求又低(差不多是这样…)。都说高考其实是相对公平的选拔,那么今天我们就用数据来说话,看看全国的教育资源,高校分布到底是怎样,哪里的小伙伴相对来说,更容易踏入大学的校门呢。数据获取这里我选择的是“高考网”作为我数据的来源http://college.gaokao.com/schlist/p1 网站很简单,也没有任何的反爬机制,直接分析页面,获取并保存数据就可以了 这里直接给出代码,不关心数据获取过程的小伙伴儿可以跳过此部分importrequests frombs4importBeautifulSoup importos importtime defget_data():

  • 看图理解进程间通信IPC

    什么是进程间通讯进程间通信(inter-processcommunication或interprocesscommunication,简写IPC)是指两个或两个以上进程(或线程)之间进行数据或信号交互的技术方案。通常,IPC一般包含客户端和服务器,客户端请求数据,服务器响应请求(比如分布式计算中就是这样)。有哪些IPC方法IPC方法适用的环境文件(File)存储在磁盘上的记录,或由文件服务器按需合成的记录,可以由多个进程访问。信号(Signal)系统消息从一个进程发送到另一个进程,一般不用于传输数据,而是用于远程传输命令。套接字(Socket)通过网络接口将数据量发送到本机的不同进程或远程计算机。Unix域套接字(Unixdomainsocket)用于在同一台机器上运行的进程之间的通信。虽然因特网域套接字可用于同一目的,但UNIX域套接字的效率更高。UNIX域套接字仅仅复制数据;它们并不执行协议处理,不需要添加或删除网络报头,无需计算检验和,不要产生顺序号,无需发送确认报文。消息队列(Messagequeue)类似于套接字的数据流,但消息有自己的结构,它允许多个进程只需要读写消息队列,

  • machine learning 之 Neural Network 2

    整理自AndrewNg的machinelearning课程week5.目录:NeuralnetworkandclassificationCostfunctionBackpropagation(tominimizecostfunction)BackpropagationinpracticeGradientcheckingRandominitializationAssurestructureandTrainaneuralnetwork前提:训练数据集:${(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)})}$L:神经网络的总的层数,totallayers,如下图,L=4$s_l$:第l层的单元数目,如下图,$s_1=3,s_2=5,...$K:输出层的单元数,如下图,K=41、neuralnetworkandclassification对于二分类问题(binaryclassification):输出为0或1,K=1对于多分类问题(Multi-classclassification):输出为hotone编码形式,K为类别数目,类

  • CVPR—II | 经典网络再现,全内容跟踪

    今天首先给大家带来“YOLO”!也被上一篇“Faith”读者说对了,在此也感谢大家的关注与阅读,O(∩_∩)O谢谢 YOLO看到这个封面,相信很多很多都阅读过,其实这是一篇“基于回归方法的深度学习目标检测算法”的经典之作,如果兴趣的您,可以再一次阅读。会不会有朋友认为YOLO的缩写是YouOnlyLiveOnce???O(∩_∩)O,其实是YouOnlyLookOnce。相比于之前介绍的几个网络,明显高于之前说的几个简单目标检测网络。下面来一个YOLOV2的宣传片!有兴趣的您,可以自己去做一个模型玩一玩,其实过程很不错!(“计算机视觉战队”微信平台的人脸检测与识别技术(怎么去创新?)也有简单的Demo。)视频内容视频内容回归正题,开始说内部的内容!我自己来总结下YOLO:YOLO网络的结构和在之前得模型比较类似,主要是最后两层的结构,卷积层之后接了一个4096维的全连接层,然后后边又全连接到7*7*30维的张量上。实际上这个7*7就是划分的网格数,现在要在每个网格上预测目标两个可能的位置及这个位置的目标置信度和类别,也就是每个网络预测两个目标,每个目标的信息有4维坐标信息(中心点坐标+

  • 数据恢复:AMDU数据抽取恢复

    今天我们通过一则真实的案例来认识oracle自带工具AMDU,无需将磁盘组mount即可实现数据分析,轻松进行数据恢复某日,我们收到了一则中国香港用户ASM破坏案例,请求数据恢复。灾难描述这则案例是由于存储误操作引起的:1.用户进行存储维护和磁盘添加操作2.维护后发现CRS无法启动3.检查发现OCR盘损坏,ASM磁盘组受损4.经用户反复确认,故障原因是因为误操作磁盘导致的ASM磁盘受损5.为减少意外,客户请求在不更改配置等的情况下安全抽取数据6.数据库为3节点RAC系统灾难再一次由于疏忽而降临。技术回放对于这个案例,我们有多种手段可以进行恢复,只要ASM磁盘组完好,就可以很容易的从中提取数据,本案例我们使用了AMDU工具进行恢复。AMDU工具在Oracle10g中,ASM磁盘组的信息需要在Mount之后才能通过内部视图查询,如果磁盘组因为故障无法正常加载,那么信息将不可用,这为诊断带来了诸多不便。从Oracle11g开始,Oracle提供了一个工具AMDU用于协助诊断,通过这个工具可以在磁盘组加载之前将ASM的元数据抽取出来,用于数据库诊断,这个工具可以向后兼容,引入到10g中。通过a

  • Ubuntu中安装和配置 Java JDK,并卸载自带OpenJDK(以Ubuntu 14.04为例)

    1.下载jdk-7u67-linux-x64.tar.gz 2.用ftp客户端工具filezilla上传到ubuntu的合适文件夹。如果如果不能上传到指定文件夹可能是文件夹权限不足,修改文件夹可执行权限,最简单的方法是赋予权限,即:   chmod777文件夹 (777)为最高权限    3.自解压安装jdk,我解压在了/usr/cpy下   tar-xzvf jdk-7u67-linux-x64.tar.gz 安装完后,会生成jdk1.7.0_67文件夹 4.设置环境变量,对于对vi不熟悉的用户使用gedit命令启动文本编辑器比起vi命令更方便   sudo gedit /etc/profile 添加以下内容并保存退出 原本内容: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games" 新添加内容: exportJAVA_HOME="/usr/cp

  • 都闪开,不用任何游戏引擎,html也能开发格斗游戏

    html格斗游戏,对打游戏 不用引擎,不用画布canvas,不用任何库(包括jquery),原生div+img组件,开发格斗游戏游戏教程视频已经上传b站:https://www.bilibili.com/video/av89986087/ 接下来会陆续发布该游戏的开发教程。   大家好,我是居家懒人,现在是2020年,我在湖北老家过春节,嗯~~~,因为这次武汉冠状病毒,大家都憋在家,都说呆在家里不出门,就是对国家最好的贡献,各位兄弟姐妹们,有没有坚持室内健身和学习呢 我的职业是做IT农民,就是什么也不会,生活圈子狭窄,只会写代码的码农 宅在家这些天,吃的很好,但是睡的其实不好,因为心里头空空的,躺在床上很晚了却睡不着,直到一天我翻出了自己的记事本里的一个记录之后   接下来的几天作息时间才有了一些节奏,我记事本里这个想法就是用原生html写一个小游戏,看看能做到什么程度。   对了介绍一下我的工作,感觉慢杂乱的,做过技术主管,开发过手游,页游,app,还开发过小程序,甚至还做过flash动画广告制作,那是我大学毕业后早报纸上找到的第一份工作.大学的一个兴

  • Android6.0运行时权限管理

    自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有的权限而导致的无法安装的事情,也不会再不征求用户授权的情况下,就可以任意的访问用户隐私,而且即使在授权之后也可以及时的更改权限。这就是6.0版本做出的更拥护和注重用户的一大体现。 一、认知 今天我们就来学习下Android6.0的权限管理。 Android6.0系统把权限分为两个级别: 一个是NormalPermissions,即普通权限,这类权限不会潜藏有侵害用户隐私和安全的问题,比如,访问网络的权限,访问WIFI的权限等; 另一类是DangerousPermissions,即危险权限,这类权限会直接的威胁到用户的安全和隐私问题,比如说访问短信,相册等权限。 但是到底哪些是普通权限和危险权限呢,这里给出分类,大家在使用时以便参考。 1、NormalPermissions(普通权限) ACCESS_LOCATION_EXTRA_COMMANDS ACCESS_NETWORK_STATE ACCESS_NOTI

  • ASP.NET Core中的Http缓存

    ASP.NETCore中的Http缓存 Http响应缓存可减少客户端或代理对web服务器发出的请求数。响应缓存还减少了web服务器生成响应所需的工作量。响应缓存由Http请求中的header控制。 而ASP.NETCore对其都有相应的实现,并不需要了解里面的工作细节,即可对其进行良好的控制。 了解Http缓存 Http协议中定义了许多缓存,但总体可以分为强缓存和协商缓存两类。 强缓存 强缓存是指缓存命中时,客户端不会向服务器发请求,浏览器F12能看到响应状态码为200,size为fromcache,它的实现有以下几种方式: Expires-绝对时间 示例:Expires:Thu,31Dec203723:59:59GMT,就表示缓存有效期至2037年12月31日,在这之前浏览器都不会向服务器发请求了(除非按F5/Ctrl+F5刷新)。 Cache-Control-相对时间/更多控制 绝对时间是一个绝对时间,因为计算时不方便;而且服务端是依据服务器的时间来返回,但客户端却需要依据客户的时间来判断,因此也容易失去控制。 Cache-Control有以下选项(可以多选): max-ag

  • MYSQL性能调优

    摘要 为了学习研究MySQL数据库在工作原理,深刻理解MySQL在企业运用时如何保证其高效运行。分别从表结构的优化,SQL语句的优化,存储引擎的选择,索引的优化以及现今MySQL的发展与其他企业级数据库的比较。介绍了从编码选择到数据类型的选择以及从整体的角度设计表结构。在SQL语句的选择和使用的介绍的时候,深入介绍了一些基本的使用原则以及在一般在使用过程中我们存在的误区以及如何解决这些问题。着重介绍了MySQL的几个存储引擎MyISAM、InnoDB和NDBCluster的差异以及各自的适用范围。有介绍了MySQL的索引的一些优化的建议以及高屋建瓴地阐述和比较了MySQL的优劣和发展态势。     前言     数据库作为应用作为广泛,地位极为重要的中间件应用,学习和使用数据库管理系统变得越来越重要。为了研究和总结对mysql数据库的学习结果,特别从数据表结构、sql语句优化、存储引擎的选择、索引的应用、以及mysql的比较总结对mysql技术做了一个比较全面升入的介绍。使用mysql的过程中,如何更好地使用与优化越来越重要,在这篇文章中就阐述。

  • codeforces 760E or 759C 【线段树维护后缀和】

    C.Nikitaandstack timelimitpertest 2seconds memorylimitpertest 256megabytes input standardinput output standardoutput Nikitahasastack.Astackinthisproblemisadatastructurethatsupportstwooperations.Operationpush(x)putsanintegerxonthetopofthestack,andoperationpop()deletesthetopintegerfromthestack,i. e.thelastadded.Ifthestackisempty,thentheoperationpop()doesnothing. Nikitamademoperationswiththestackbutforgotthem.NowNikitawantstorememberthem.Heremembersthemonebyone,onthei-thstepheremembersan

  • mysql查看当前执行线程_关闭当前的某些线程 show processlist_kill

    每个与mysqld的连接都在一个独立的线程里运行,您可以使用SHOWPROCESSLIST语句查看哪些线程正在运行,并使用KILL thread_id语句终止一个线程。 如果您拥有SUPER权限,您可以终止所有线程和语句。否则,您只能查看和终止您自己的线程和语句。 您也可以使用mysqladminprocesslist和mysqladminkill命令来检查和终止线程。 1、SHOWPROCESSLIST 2、kill6 3、再次showprocesslist,可看到下图效果: 在多数情况下,线程终止可能要花一些时间,这是因为终止标记只会在在特定的间隔被检查; 线程正在释放资源,过会儿才真正的死掉了。

  • Codeforces Round #753 (Div. 3)

    D.Blue-RedPermutation 思路: 贪心,先把blue颜色的num放到前面,因为它们只能变小或者不变而不能变大,我们要得到的是一个1~n的排列,也就是说得到的数组的值中1~n这些数必然出现并且一个只出现一次。那么我们把可以变小的num先放到前面(同颜色的按值大小排序,显然值越小越排到前面)。因为变小可以确保能先遍历到小的num然后就是定义一个num来表示当前要造的数,如果我们遍历数组时,它比num大而且它只能变大,那肯定就是不对的、如果它比num小并且它只能变小,也是不对的。 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<set> #include<vector> #include<map> #include<unordered_s

  • 14.Python内置函数⼆

    ⼀.lamda匿名函数 为了解决⼀些简单的需求⽽设计的⼀句话函数 lambda表⽰的是匿名函数.不需要⽤def来声明,⼀句话就可以声明出⼀个函数 语法: 函数名=lambda参数:返回值 注意: 1.函数的参数可以有多个.多个参数之间⽤逗号隔开 2.匿名函数不管多复杂.只能写⼀⾏,且逻辑结束后直接返回数据 3.返回值和正常的函数⼀样,可以是任意数据类型 匿名函数并不是说⼀定没有名字.这⾥前⾯的变量就是⼀个函数名.说他是匿名原因是我们通 过__name__查看的时候是没有名字的.统⼀都叫lambda.在调⽤的时候没有什么特别之处. 像正常的函数调⽤即可 ⼆.sorted() 排序函数. 语法:sorted(Iterable,key=None,reverse=False) Iterable:可迭代对象 key:排序规则(排序函数),在sorted内部会将可迭代对象中的每⼀个元素传递给这个函 数的参数.根据函数运算的结果进⾏排序reverse:是否是倒叙.True:倒叙,False:正序 和函数组合使⽤ 和lambda组合使⽤ 三.fifilter() 筛选函数 语法:fifilte

  • 一、用户配置文件&amp;用户组管理相关文件

    0、用户管理简介      1、初始组合附加组        2、用户信息文件/etc/passwd      3、影子文件/etc/shadow             4、组信息文件/etc/group和组密码文件/etc/gshadow            5、时间戳换算      6、用户家目录         7、用户的邮箱   /var/spol/mail/用户名   8、用户管理目录   /etc/skel/  

相关推荐

推荐阅读