容器部署即使用docker
化部署golang应用程序,这是在云服务时代最流行的部署方式,也是最推荐的部署方式。
在以下我们的示例中,统一使用 main
作为项目名称。
跨平台交叉编译是golang的特点之一,可以非常方便地编译出我们需要的目标服务器平台的版本,而且是静态编译,非常容易地解决了运行依赖问题。
使用以下指令可以静态编译Linux
平台amd64
架构的可执行文件:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o main main.go
生成的main
便是我们静态编译的,可部署于Linux amd64
上的可执行文件。
我们需要将该可执行文件main
编译生成docker
镜像,以便于分发及部署。Golang的运行环境推荐使用alpine
基础系统镜像,编译出的容器镜像约为20MB左右。
一个参考的Dockerfile
文件如下:
FROM loads/alpine:3.8
LABEL maintainer="john@goframe.org"
###############################################################################
# INSTALLATION
###############################################################################
# 设置固定的项目路径
ENV WORKDIR /app/main
# 添加应用可执行文件,并设置执行权限
ADD ./main $WORKDIR/main
RUN chmod +x $WORKDIR/main
# 添加静态资源文件
ADD resource $WORKDIR/resource
###############################################################################
# START
###############################################################################
WORKDIR $WORKDIR
CMD ./main
其中,我们的基础镜像使用了loads/alpine:3.8
,中国国内的用户推荐使用该基础镜像,基础镜像的Dockerfile地址:https://github.com/gqcn/dockerfiles ,仓库地址:https://hub.docker.com/u/loads
随后使用 docker build -t main .
指令编译生成名为main
的docker
镜像。
需要注意的是,在某些项目的架构设计中,静态文件和配置文件可能不会随着镜像进行编译发布,而是分开进行管理和发布。
例如,使用MVVM
模式的项目中(例如使用vue框架),往往是前后端非常独立的,因此在镜像中往往并不会包含public
目录。而使用了配置管理中心(例如使用consul/etcd/zookeeper
)的项目中,也往往并不需要config
目录。
因此对于以上示例的Dockerfile
的使用,仅作参考,根据实际情况请进行必要的调整。
使用以下指令可直接运行刚才编译成的镜像:
docker run main
容器的分发可以使用docker官方的平台:https://hub.docker.com/ ,国内也可以考虑使用阿里云:https://www.aliyun.com/product/acr
在企业级生产环境中,docker
容器往往需要结合kubernetes
或者docker swarm
容器编排工具一起使用。
GoFrameORM组件针对于struct内嵌结构提供了良好的支持,包括参数传递、结果处理。例如:type Base struct {Uidint `orm:...
对OpenTelemetry的概念有初步了解后,我们接着以Jaeger为例来演示如何在程序中使用实现链路追踪。JaegerJaeger是Uber开...
普通数组package mainimport ("fmt""github.com/gogf/gf/v2/container/garray")func main () {// 创建并发安全的int类型数组a :=...
通常,删除方法被命名为 delete()。该方法立刻删除对象,并返回被删除的对象数量和一个包含了每个被删除对象类型的数量的字...
到目前为止,我们已经处理了被查询模型字段的聚合。然而,有时候想聚合的值属于你正在查询模型的关联模型。当在聚合函数中指定要...
有时你需要执行与当前数据库事务相关的操作,但前提是事务成功提交。Django提供了on_commit()函数来注册在事务成功提交后应该执...
ASP.NET Calendar CellPadding 属性 Calendar 控件定义和用法 CellPadding 属性用于设置日历单元格边框与其内容之间的空白。 语...
ASP.NET ImageButton ValidationGroup 属性 ImageButton 控件定义和用法 ValidationGroup 属性规定了在验证时被验证的控件组。 ...