Docker源码修改工作总结(三)

2023-11-13

话不多说上干货:

一、安装mysql数据库,并且建立相关表

在本地主机上安装mysql数据库,并且建立一个名为docker的数据库,在数据库中建立两个数据表分别为container_auto和container_user,分别代表自动生成的秘钥和用户自己输入的秘钥,两个表的字段都为id和passphrase,如下

mysql> create table container_auto(
> id char(20) not null primary key,
> passphrase char(40) not null);

 container_user和container_auto结构一样

二、搭建docker编译环境

搭建教程,并在/go/src/github.com/docker/docker下修改源码,最后编译

三、修改源码

在/go/src/github.com/docker/docker修改

mkdir crypt

vi crypt/mysql.go

package crypt

import (
	"database/sql"
	_ "github.com/go-sql-driver/mysql"
)

func InsertUser(id string, passphrase string) {
	db, err := sql.Open("mysql", "root:zhang@tcp(127.0.0.1:3306)/docker?charset=utf8")
	checkErr(err)
	stmt, err := db.Prepare(`INSERT container_user (id,passphrase) values (?,?)`)
	checkErr(err)
	_, err = stmt.Exec(id, passphrase)
	checkErr(err)
}

func InsertAuto(id string, passphrase string) {
	db, err := sql.Open("mysql", "root:zhang@tcp(127.0.0.1:3306)/docker?charset=utf8")
	checkErr(err)
	stmt, err := db.Prepare(`INSERT container_auto (id,passphrase) values (?,?)`)
	checkErr(err)
	_, err = stmt.Exec(id, passphrase)
	checkErr(err)
}

func Remove(id string) {
	db, err := sql.Open("mysql", "root:zhang@tcp(127.0.0.1:3306)/docker?charset=utf8")
	checkErr(err)
	stmt_auto, err := db.Prepare(`DELETE FROM container_auto WHERE id=?`)
	checkErr(err)
	_, err = stmt_auto.Exec(id)
	checkErr(err)
	stmt_user, err := db.Prepare(`DELETE FROM container_user WHERE id=?`)
	checkErr(err)
	_, err = stmt_user.Exec(id)
	checkErr(err)
}

func QueryUser(id string) string {
	db, err := sql.Open("mysql", "root:zhang@tcp(127.0.0.1:3306)/docker?charset=utf8")
	checkErr(err)
	var password string
	rows, err := db.Query(`SELECT passphrase FROM container_user WHERE id=?`, id)
	checkErr(err)
	for rows.Next() {
		err := rows.Scan(&password)
		checkErr(err)
	}
	return password
}

func QueryAuto(id string) string {
	db, err := sql.Open("mysql", "root:zhang@tcp(127.0.0.1:3306)/docker?charset=utf8")
	checkErr(err)
	var password string
	rows, err := db.Query(`SELECT passphrase FROM container_auto WHERE id=?`, id)
	checkErr(err)
	for rows.Next() {
		err := rows.Scan(&password)
		checkErr(err)
	}
	return password
}

func checkErr(err error) {
	if err != nil {
		panic(err)
	}
}

vi crypt/crypt.go

package crypt

import (
	"math/rand"
	"time"
)

func init() {
	rand.Seed(time.Now().UnixNano())
}

func RandStringBytes(n int) string {

	const letterBytes = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
	b := make([]byte, n)
	for i := range b {
		b[i] = letterBytes[rand.Intn(len(letterBytes))]
	}
	return string(b)
}

func SubstrId(str string) string {
	return string([]byte(str)[:12])
}

/*func SetCrypt() string {
	var password, verify_password string

	for {
		fmt.Println("Enter passphrase:")
		fmt.Scanln(&password)
		fmt.Println("Verify passphrase:")
		fmt.Scanln(&verify_password)
		if password == verify_password {
			fmt.Println("Success!")
			return password
		} else {
			fmt.Println("The passwords do not match,please enter angin!")
		}
	}
}*/

/*
func SelectMode(id string) {
	var num string
	for {
		fmt.Println("Please select mode,enter the number:")
		fmt.Println("1.User input mode")
		fmt.Println("2.Automatic generation")
		fmt.Scanln(&num)
		if num == "1" || num == "2" {
			break
		} else {
			fmt.Println("Enter error,please enter the number!")
		}
	}
	switch num {
	case "1":
		fmt.Println("Welcome user input mode!")
		InsertMysql(SubstrId(id), SetCrypt())
	case "2":
		fmt.Println("Welcome automatic generation mode!")
		InsertMysql(SubstrId(id), RandStringBytes(12))
	}
}

func Test() {
	fmt.Println("this is a test")
}
*/

vi cli/command/container/run.go

12
"github.com/docker/docker/crypt"
32
crypt string
61
flags.StringVar(&opts.crypt,"crypt","","Set a password for your docker storage encryption")
146
if opts.crypt != "" {
    crypt.InsertUser(crypt.SubstrId(createResponse.ID), opts.crypt)
}else{
    crypt.InsertAuto(crypt.SubstrId(createResponse.ID), crypt.RandStringBytes(12))
}

vi cli/command/container/rm.go

6
"github.com/docker/docker/crypt"
53 	
for _, container := range opts.containers {
	password_user:=crypt.QueryUser(crypt.SubstrId(container))
	password_auto:=crypt.QueryAuto(crypt.SubstrId(container))
	if password_auto == "" && password_user == ""{
           return errors.New("Please use the container id instead of the container name")
    }
}

vi client/container_remove.go

6 		
"github.com/docker/docker/crypt"
27 		
crypt.Remove(containerID)

vi cli/command/container/start.go

11		
"github.com/docker/docker/crypt"
25		
crypt string
52		
flags.StringVar(&opts.crypt,"crypt","","Start your container need your password")
73		
password_user:=crypt.QueryUser(crypt.SubstrId(container))	
password_auto:=crypt.QueryAuto(crypt.SubstrId(container))
if password_auto == "" && password_user == ""{
    return errors.New("Please use the container id instead of the container name")
        }
if opts.crypt == "" && opts.crypt != password_user{
	return errors.New("You should enter the password you used to set")
}else if opts.crypt != "" && opts.crypt != password_user{
	return errors.New("Your password is wrong")
}
172
for _,container := range opts.containers{
    password_user:=crypt.QueryUser(crypt.SubstrId(container))
    password_auto:=crypt.QueryAuto(crypt.SubstrId(container))
    if password_auto == "" && password_user == ""{
        return errors.New("Please use the container id instead of the container name")
    }
    if opts.crypt == "" && opts.crypt != password_user{
        return errors.New("You should enter the password you used to set")
    }else if opts.crypt != "" && opts.crypt != password_user{
        return errors.New("Your password is wrong")
    }
}

vi cli/command/container/restart.go

9 		
"github.com/docker/docker/crypt"
18 		
crypt string
39			
flags.StringVar(&opts.crypt,"crypt","","Start your container need your password")
53	     
for _,name := range opts.containers {
    password_user:=crypt.QueryUser(crypt.SubstrId(name))
    password_auto:=crypt.QueryAuto(crypt.SubstrId(name))
    if password_auto == "" && password_user == ""{
        return errors.New("Please use the container id instead of the container name")
    }
    if opts.crypt == "" && opts.crypt != password_user{
        return errors.New("You should enter the password you used to set")
    }else if opts.crypt != "" && opts.crypt != password_user{
        return errors.New("Your password is wrong")
    }
}

四、缺陷

增加了对docker run,docker start,docker restart,docker rm的修改,但是所有都是对于容器id操作,缘由是数据库的字段是id,不能对容器name进行操作,观察容器name的代码比较复杂,没有深入修改,望后期能健全

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker源码修改工作总结(三) 的相关文章

随机推荐

  • MySQL主主复制+Keepalived 打造高可用MySQL集群

    转载地址 http www linuxidc com Linux 2014 09 106570 htm 为了响应公司需求 打造出更安全的mysql集群 能够实现mysql故障后切换 研究了几天终于有了成果 一起分享一下 首先介绍一下这套集群
  • 代码和数据结构

    代码 58同城 给出任意一个正整数 怎么用递归把他反过来打印 include
  • C++ 类 & 对象

    C 在 C 的基础上增加了面向对象编程 OOP 支持面向对象程序设计 类是 C 的核心特性 一种用户自定义的类型 用于指定对象的形式 类包含数据和用于处理数据的方法 函数 数据称为成员变量 函数称为成员函数 类可以看作是一种模板 用来创建具
  • 2022-03-09 Unity 3D两个场景的切换

    文章目录 效果 实现步骤 1 创建场景 2 添加按钮 3 写C 脚本实现切换 4 添加Component到Button上 5 添加两个Scene到Build中 测试效果 参考资料 效果 在scene1中点击按钮 进入scene2 实现步骤
  • Android 高德地图 关于INVALID_USER_KEY和INVALID_USER_SCODE的问题

    本文主要讲我在配置高德地图时候碰到的问题和解决方法 希给遇到同样问题的你一些帮助 1 INVALID USER KEY 当时我的Log上显示此问题 并且显示key为空 但我明明在mete data标签中写了我的key值 后发现manifes
  • 基于Spring Boot AOP用户权限系统模块开发

    公司项目需要涉及到用户权限的问题 每个用户都应该有自己的权限 而且权限应该是灵活可变的 系统的登陆模块因为涉及到分布式部署的问题以及前后端分离 不能采用传统的session作为登陆方式 而是采用JWT的方式实现 保证了接口的无状态性 但是这
  • 初步认识Ehcache清空缓存的3种策略

    Ehcache是一种广泛使用的开源Java分布式缓存 主要面向通用缓存 Java EE和轻量级容器 它具有内存和磁盘存储 缓存加载器 缓存扩展 缓存异常处理程序 一个gzip缓存servlet过滤器 支持REST和SOAP api等特点 在
  • flutter dio HandshakeException: Handshake error in client 解决方法,以及DefaultHttpClientAdapter红线问题。

    是证书问题导致 下面是强制认证 import package dio dio dart import package dio adapter dart 导入这个包 添加DefaultHttpClientAdapter Response re
  • 错误【ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed...】

    Downloading https download pytorch org models resnet50 19c8e357 pth to home luanhaijing cache torch hub checkpoints resn
  • 语音识别之获取语言数据(portaudio的平台搭建)

    我们要进行语言识别 那么就要先构建好平台 portaudio 我们需要采集所需要的16KHZ频率 16比特的声音信号 我们就可以采用portaudio来实现这个功能 那么这个Portaudio怎么使用呢 请看 http www cnblog
  • Java基础十一(private、this关键字和构造函数)

    私有private关键字 成员变量是否一定需要全部向外界访问 如果需要向外界访问 则public 如不需要向外界访问 则private 但是一般而言 都会将成员变量私有化 给成员变量 private是彻底不想给外界类中不需要对外提供的内容都
  • Python中类属性和类方法

    1 类的结构 1 1 术语 实例 使用面相对象开发 第 1 步 是设计 类 使用 类名 创建对象 创建对象 的动作有两步 1 在内存中为对象 分配空间 2 调用初始化方法 init 为 对象初始化 对象创建后 内存 中就有了一个对象的 实实
  • UID卡、CUID卡、FUID卡、UFUID卡的区别及写入方式

    UID卡 国外又称GEN1 所有区块可被重复读写 卡片ID可改写且使用后门指令更改ID 卡片ID可重复修改 相应后门指令 意味着可被使用后门指令检测是否为克隆卡的机器发现 CUID卡 国外又称GEN2 所有区块可被重复读写 卡片ID可改且使
  • align text-align

    align 规定 div 元素中的内容的水平对齐方式 text align 规定 元素中 的文本的水平对齐方式 两个属性使用的地方不一样的 div align center This is some text div align直接写在是d
  • WPF在TreeView的子项中的TextBlock,触发点击事件时,获得当前文本框所在的TreeViewItem数据对象

    要实现的效果是 在一个深层treeview控件的treeviewitem中有个textblock 而我要在点击这个textblock时阻断向下传递 e handle true 并且将当前这个项的绑定属性IsExpanded设置相反值 前台代
  • CSRF漏洞简单解决

    在表单内增加了一个隐藏域 再登陆页面增加 然后扫描软件在扫描就扫描不出来了 如下
  • 光敏电阻的原理及应用

    转载出 http www jqr8 com thread 1406 1 1 html 一 光敏电阻的概念 光敏电阻器 photovaristor 又叫光感电阻 是利用半导体的光电效应制成的一种电阻值随入射光的强弱而改变的电阻器 入射光强 电
  • 第一章 Web前端技术简介 A卷

    一 选择题 在HTML中有效 规范的注释声明是 D A 这是注释 B C D 关于W3C标准 下列说法错误的是 B A W3C标准是由W3C组织制定的一系列Web标准 B htm span p 是符合W3C标准规范的书写方式 C W3C标准
  • python万能存储包pickle

    pickle几乎可以保存python的一切格式对象 字典 列表等等 无需将其转为numpy或pandas等其他格式再保存 缺点是它不像json等是通用格式 只能使用python来读取 pickle官方文档 pickle dump obj f
  • Docker源码修改工作总结(三)

    话不多说上干货 一 安装mysql数据库 并且建立相关表 在本地主机上安装mysql数据库 并且建立一个名为docker的数据库 在数据库中建立两个数据表分别为container auto和container user 分别代表自动生成的秘