最近用 go 写了一个 web 应用,但用 docker 部署时候,对于如何加入依赖的第三方包,产生了困惑,这边感谢大 D 的解惑,下面开始 docker 部署go 开发的web 应用
一、go mod
1、什么是 go mod
在桌面新建一个文件夹 HelloWorld,在 HelloWorld 里新建 index.go
- go 的项目需要引入第三库时,需要将项目放到 $GOPATH/src 目录下,否则报错
- 如果想在你磁盘的任意位置运行你的 go 程序,你需要 go mod,一个包依赖管理工具
2、go mod 初尝试
$ go mod init testDemo
运行结果:
- 出现 go: creating new go.mod: module testDemo 表示初始化成功
- go mod init 后面定义你的项目名,当前目录会产生一个 go.mod 的文件
$ go run index.go
` 运行结果:成功
- 再次运行 index.go 文件,成功,当前目录会产生一个 go.sum 的文件
3、go mod 管理
可以用环境变量 GO111MODULE 开启或关闭模块支持,它有三个可选值:off、on、auto,默认值是 auto。
- GO111MODULE=off 无模块支持,go 会从 GOPATH 和 vendor 文件夹寻找包。
- GO111MODULE=on 模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod 下载依赖。
- GO111MODULE=auto 在 GOPATH/src 外面且根目录有 go.mod 文件时,开启模块支持。
二、go build
基于上面使用 go mod 管理依赖包的项目HelloWorld,进行如下几种方式编译,来熟悉 go build 命令,更多详情请看 go build 命令
1、go build 无参数编译
$ go build
$ ls
go.mod go.sum index.go testDemo
编译结果:产生testDemo文件, 默认为当前目录的项目名(go mod init testDemo),建议项目名和你根目录文件名一致
2、go build+ 文件列表
$ go build index.go
$ ls
go.mod go.sum index index.go
编译结果:产生index文件,和编译的文件名一致,编译多个文件时,默认以第一个文件名命名
3、go build+ 包
$ go build testDemo
$ ls
go.mod go.sum index.go testDemo
编译结果:产生testDemo文件,当前包名为:testDemo(系统GOPATH目录下的项目,包名为:项目根目录文件名)
4、go build 编译时的附加参数
附加参数 | 备注 |
---|---|
-o | 指定编译后生成的文件名 |
-v | 编译时显示包名 |
-p n | 开启并发编译,默认情况下该值为 CPU 逻辑核数 |
-a | 强制重新构建 |
-n | 打印编译时会用到的所有命令,但不真正执行 |
-x | 打印编译时会用到的所有命令 |
-race | 开启竞态检测 |
三、构建 docker 镜像
1、构建流程
- 项目开发使用 go mod 管理依赖
- Dockerfile 中配置 docker 环境变量:GO111MODULE=on,GOPROXY=https://goproxy.cn (代理)
- 使用 go build 自动下载依赖的第三库
2、Dockerfile 模版
FROM golang:alpine
WORKDIR /opt/LoopGraph/
COPY . /opt/LoopGraph/
ENV GO111MODULE=on
ENV GOPROXY=https://goproxy.cn
RUN apk add --no-cache gcc musl-dev git && go build -I -v
EXPOSE 8070
ENTRYPOINT ["./LoopGraph"]
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于