在基于docker笔记(四、docker部署beego打包后的二进制文件)和docker笔记(五、docker安装mysql数据库)的基础上,上传图片的同时,也网数据库中插入一条记录。
beego部分代码(在docker笔记(五、docker安装mysql数据库)的基础上添加了一些代码)
conf/app.conf
appname = docker_test
httpport = 8080
runmode = dev
mysqlUser = root
mysqlPwd = ailab
mysqlHost = localhost
mysqlPort = 3306
mysqlDbName = docker_test
models/init.go
package models
import (
"fmt"
"github.com/astaxie/beego"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql" // import your used driver
"time"
)
var db *gorm.DB
var mysqlUser string
var mysqlPwd string
var mysqlHost string
var mysqlPort string
var mysqlDbName string
type BaseModel struct {
Id int64 `gorm:"primary_key" json:"-"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
type Image struct {
BaseModel
ImageName string `gorm:"unique;not null"`
ImagePath string `gorm:"not null"`
}
func init() {
mysqlUser = beego.AppConfig.String("mysqlUser")
mysqlPwd = beego.AppConfig.String("mysqlPwd")
mysqlHost = beego.AppConfig.String("mysqlHost")
mysqlPort = beego.AppConfig.String("mysqlPort")
mysqlDbName = beego.AppConfig.String("mysqlDbName")
initMsql()
}
func initMsql() {
var err error
mysqlArgs := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local", mysqlUser, mysqlPwd, mysqlHost, mysqlPort, mysqlDbName)
beego.Info("sqlStr:",mysqlArgs)
db, err = gorm.Open("mysql", mysqlArgs)
if err != nil {
beego.Info("连接smart数据库错误:", err.Error())
return
}
//defer db.Close()
//禁用表名复数形式
db.SingularTable(true)
//clearTables()
db.LogMode(false)
db.Set("gorm:table_options", "charset=utf8").AutoMigrate(
&Image{},
)
}
func GetMysqlDB() (db_con *gorm.DB) {
return db
}
dao/imageDao.go
package dao
import "docker_test/models"
func SaveImage(imageName,imagePath string) error {
image := &models.Image{ImageName:imageName,ImagePath:imagePath}
return models.GetMysqlDB().Create(image).Error
}
controllers/default.go
func (c *ImageUploadController) Post() {
var code int
file, fileHeader, _ := c.GetFile("img")
beego.Info("收到图片上传")
if file != nil {
defer file.Close()
savePath := "static/img/" + fileHeader.Filename
c.SaveToFile("img", savePath)
err := dao.SaveImage(fileHeader.Filename,savePath)
beego.Info("保存图片:",err)
}
code = 200
beego.Info("返回json")
c.Data["json"] = &models.ResponseJson{Code:code,Msg:"success"}
c.ServeJSON()
}
在本地调试没问题后,执行go build将工程打包成一个可执行的二进制文件
① 将docker_test、conf文件夹、static文件夹和views文件夹拷贝到服务器,然后构建DockerFIle
FROM golang:latest
#创建工作目录
RUN mkdir -p /go/src/go_test/static/
#进入工作目录
WORKDIR /go/src/go_test
#将当前目录下的所有文件复制到指定位置
COPY . /go/src/go_test
#端口
EXPOSE 8080
RUN chmod 777 ./docker_test
ENTRYPOINT ["./docker_test"]
构建镜像
sudo docker build -f DockerFile -t go_app:1.0 .
② 参考docker笔记(五、docker安装mysql数据库)将mysql容器跑起来
sudo docker run -p 3307:3306 --name mydb -v /home/lenovo/docker_test/mysql/conf/:/etc/mysql/conf.d -v /home/lenovo/docker_test/mysql/logs:/logs -v /home/lenovo/docker_test/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
③ 运行第一步build的镜像,并和mysql关联起来
sudo docker run -it --name mga --link mydb:mysql -p 8080:8080 -v /home/lenovo/docker_test/go_test/static/:/go/src/go_test/static/ --privileged=true go_app:1.0
--link 是用来连接两个容器
格式为 --link
:alias,其中,name和id是源容器的name和id,alias是这个连接的别名。 通俗的讲,站在mga容器(以go_app:1.0镜像为模板创建的容器)的角度来说,mydb和mysql都是容器70bdce0ccbcb(已经跑起来的mysql容器)的名称,并且作为容器的hostname,mga用这2个名字中的哪一个都可以访问到70bdce0ccbcb容器并与之通信(docker通过DNS自动解析)
进入mga容器中,ping哪一个容器都可以ping通,都是指向172.17.0.2
④ 验证,访问localhost:8080
用postman上传一张图片:
可以看到static文件夹里有了刚上传的图片
再去看看数据库里有没有插入图片的记录
至此大功告成!