Docker 部署 go 项目

本贴最后更新于 1694 天前,其中的信息可能已经渤澥桑田

bb2c1d8f4eb2df4fb83a7257fb4d0049.jpg

最近用 go 写了一个 web 应用,但用 docker 部署时候,对于如何加入依赖的第三方包,产生了困惑,这边感谢大 D 的解惑,下面开始 docker 部署go 开发的web 应用

一、go mod

1、什么是 go mod

在桌面新建一个文件夹 HelloWorld,在 HelloWorld 里新建 index.go

// /Users/gumkk/Desktop/HelloWorld/index.go 文件
package main
import (
    "github.com/jinzhu/configor"
    "fmt"
)
func main() {
    fmt.Println("使用外部包测试", configor.Config{})
}

运行结果:异常
屏幕快照 20190808 上午 11.43.38.png

  • go 的项目需要引入第三库时,需要将项目放到 $GOPATH/src 目录下,否则报错
  • 如果想在你磁盘的任意位置运行你的 go 程序,你需要 go mod,一个包依赖管理工具

2、go mod 初尝试

$ go mod init testDemo

运行结果:
屏幕快照 20190808 下午 12.13.05.png

  • 出现 go: creating new go.mod: module testDemo 表示初始化成功
  • go mod init 后面定义你的项目名,当前目录会产生一个 go.mod 的文件
$ go run index.go

` 运行结果:成功
屏幕快照 20190808 下午 12.13.35.png

  • 再次运行 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"]
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    475 引用 • 899 回帖
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    491 引用 • 1383 回帖 • 370 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...