golang docker部署

· · 171 次点击 · · 开始浏览     编辑

最简单的部署方式是拿生成的二进制文件直接构成镜像,但作者介绍的部署方式是镜像构建阶段使用源码自动编译成二进制文件的部署

1,首先写个将部署在docker中的http服务

package main
import (
    "fmt"
    "net/http"
)

func IndexHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "hello docker")
}

func main() {
    http.HandleFunc("/", IndexHandler)
    err := http.ListenAndServe("0.0.0.0:80", nil)
    if err != nil {
        fmt.Println(err)
    }
}

2,在同目录下加个Dockerfile文件 ,内容如下

#使用golang环境,标记第一构建阶段名称为builder
FROM golang:1.13 AS builder
#当前目录所有文件copy进去
COPY . .
#执行编译,生成/bin/hellodocker
RUN go build -o /bin/hellodocker main.go


#第二构建阶段
FROM ubuntu:18.04
#将第一构建阶段生成的二进制文件copy进去
COPY --from=builder /bin/hellodocker .
#默认执行
CMD ["./hellodocker"]

这里使用了docker的多阶段构建,如果使用单阶段构建:

FROM golang:1.13 
COPY . .
RUN go build -o hellodocker main.go
CMD ["./hellodocker"]

会有两个问题:
1,镜像中包含源码,会泄漏代码
2,由于包含golang编译环境,镜像体积会特别大
所以,作者使用了多阶段构建,将第一阶段构建的二进制文件copy到第二阶段中,第二阶段理论上只有系统镜像+二进制文件的大小
3,构建镜像

docker build -t hellodocker .

4,运行容器

docker run -itd -p 80:80 hellodocker

5,打开浏览器,输入127.0.0.1,即可看到hello docker

最终构建的镜像大小可以再优化,不包含系统镜像,但要在编译阶段将依赖项编入,这里作者就不深入了

本文来自:简书

感谢作者:

查看原文:golang docker部署

入群交流(和以上内容无关):加入Go大咖交流群,免费领全套学习资料或添加微信:muxilin131420 备注:入群;或加QQ群:729884609

171 次点击  ∙  1 赞  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传