最简单的Go Dockerfile编写姿势,没有之一!

简介: 最简单的Go Dockerfile编写姿势,没有之一!

1. Dockerfile一些额外注意点

  • 选择最简单的镜像
    比如alpine,整个镜像5M左右
  • 设置镜像时区
RUN apk add --no-cache tzdata
ENV TZ Asia/Shanghai

2. 多阶段构建

  • 第一阶段构建否则构建出可执行文件,确保构建过程独立于宿主机
  • 第二阶段将第一阶段的输出作为输入,构建出最终的极简镜像

3. 完整Dockerfile编写过程

  • 首先安装 goctl 工具
    GO111MODULE=on GOPROXY=https://goproxy.cn/,direct go get -u github.com/tal-tech/go-zero/tools/goctl
  • greet 项目下创建一个 hello 服务
    goctl api new hello
    文件结构如下:
greet
├── go.mod
├── go.sum
└── service
    └── hello
        ├── Dockerfile
        ├── etc
        │   └── hello-api.yaml
        ├── hello.api
        ├── hello.go
        └── internal
            ├── config
            │   └── config.go
            ├── handler
            │   ├── hellohandler.go
            │   └── routes.go
            ├── logic
            │   └── hellologic.go
            ├── svc
            │   └── servicecontext.go
            └── types
                └── types.go
  • hello 目录下一键生成 Dockerfile
    goctl docker -go greet.go
    Dockerfile 内容如下:
FROM golang:alpine AS builder
  LABEL stage=gobuilder
  ENV CGO_ENABLED 0
  ENV GOOS linux
  ENV GOPROXY https://goproxy.cn,direct
  WORKDIR /build/zero
  ADD go.mod .
  ADD go.sum .
  RUN go mod download
  COPY . .
  COPY service/hello/etc /app/etc
  RUN go build -ldflags="-s -w" -o /app/hello service/hello/hello.go
FROM alpine
RUN apk update --no-cache
RUN apk add --no-cache ca-certificates
RUN apk add --no-cache tzdata
ENV TZ Asia/Shanghai
WORKDIR /app
COPY --from=builder /app/hello /app/hello
COPY --from=builder /app/etc /app/etc
CMD ["./hello", "-f", "etc/hello-api.yaml"]
```
  • greet 目录下 build 镜像
    docker build -t hello:v1 -f service/hello/Dockerfile .
  • 查看镜像
    hello v1 5455f2eaea6b 7 minutes ago 18.1MB
    可以看出镜像大小约为18M。
  • 启动服务
    docker run --rm -it -p 8888:8888 hello:v1
  • 测试服务
$ curl -i http://localhost:8888/from/you
HTTP/1.1 200 OK
Content-Type: application/json
Date: Thu, 10 Dec 2020 06:03:02 GMT
Content-Length: 14
{"message":""}

4. 总结

goctl 工具极大简化了 Dockerfile 文件的编写,提供了开箱即用的最佳实践,并且支持了模板自定义。

如果觉得工具有帮助,欢迎 star 🤝

5. 项目地址

https://github.com/tal-tech/go-zero

相关文章
|
机器学习/深度学习 自然语言处理 算法
浅述几种文本和图像数据增强的方法
在现实场景中,我们往往收集不到太多的数据,那么为了扩大数据集,可以采用数据增强手段来增加样本,那么平常我们应该怎么做数据增强的呢? 什么是数据增强 数据增强也叫数据扩增,意思是在不实质性的增加数据的情况下,让有限的数据产生等价于更多数据的价值。
|
Kubernetes 应用服务中间件 nginx
提升K8S故障排除效率:详解Pod内抓包的高效策略!
提升K8S故障排除效率:详解Pod内抓包的高效策略!
877 0
|
8月前
|
存储 弹性计算 安全
2026年阿里云便宜云服务器38元、99元、199元购买条件、各自性能优势与适用场景介绍
在阿里云2026年的活动中,推出了多款价格亲民的云服务器产品。轻量应用云服务器2核2G200M带宽 40G ESSD云盘 38元1年,经济型e实例2核2G3M带宽 40G ESSD Entry云盘特惠价99元1年,通用算力型u1实例2核4G5M带宽80G ESSD Entry云盘特惠价199元1年。本文将为大家介绍这三款热门低价云服务器的购买条件、性能优势与适用场景,以供用户了解他们之间的性能、使用场景区别及选择参考。
764 8
|
Kubernetes Cloud Native 应用服务中间件
云原生|kubernetes|kubernetes集群使用私有镜像仓库拉取镜像(harbor或者官方的registry私有镜像仓库)
云原生|kubernetes|kubernetes集群使用私有镜像仓库拉取镜像(harbor或者官方的registry私有镜像仓库)
2709 0
|
数据库连接 PHP 开发者
PHP中的异常处理机制####
本文深入探讨了PHP中的异常处理机制,包括异常的定义、抛出、捕获以及自定义异常类的创建。通过实例代码展示了如何在实际应用中有效地使用try-catch语句来提高代码的健壮性和可维护性。此外,还介绍了finally块的作用及其在资源管理中的应用。 ####
345 73
|
Kubernetes 关系型数据库 Linux
Minikube:搭建部署单机 Kubernetes
Minikube:搭建部署单机 Kubernetes
Minikube:搭建部署单机 Kubernetes
|
PHP 计算机视觉 开发者
PHP中的图像处理:GD库与Imagick的应用比较
在PHP开发中,图像处理是一个常见的需求,尤其是在开发图像生成、编辑、缩放等功能时。PHP提供了两种主流的图像处理库——GD库和Imagick,它们各自具有不同的特点和适用场景。本文将对这两者进行比较,帮助开发者根据项目需求选择合适的图像处理工具。
|
Go
【golang】Go 判断字符串是否包含指定字符
【golang】Go 判断字符串是否包含指定字符
552 1

热门文章

最新文章