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

最简单的Go Dockerfile编写姿势,没有之一!的更多相关文章

  1. Dockerfile编写注意事项

    转载自:https://blog.fundebug.com/2017/05/15/write-excellent-dockerfile/ 一.目标 更快的构建速度 更小的Docker镜像大小 更少的D ...

  2. 简单的Poc Exp编写(上)

    简单的POC EXP 编写 (上)   作者BY Greekn   今天主要讲的 是关于web 方面的 poc 编写 关于web 安全 个人理解的话 一个就是攻击  另一个就是漏洞挖掘了 防御的话 看 ...

  3. 最简单的bootloader的编写

    目标:写出bootloader的第一阶段代码和第二阶段代码,并测试. 最简单的bootloader的编写步骤: 1. 初始化硬件:关看门狗.设置时钟.设置SDRAM.初始化NAND FLASH2. 如 ...

  4. selenium从入门到应用 - 2,简单线性脚本的编写

    本系列所有代码 https://github.com/zhangting85/simpleWebtest 本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下 ...

  5. Docker容器化【Dockerfile编写&&搭建与使用Docker私有仓库】

    # Docker 学习目标: 掌握Docker基础知识,能够理解Docker镜像与容器的概念 完成Docker安装与启动 掌握Docker镜像与容器相关命令 掌握Tomcat Nginx 等软件的常用 ...

  6. 最简单的 K8S 部署文件编写姿势,没有之一!

    1. 头疼编写K8S部署文件? K8S yaml 参数很多,需要边写边查? 保留回滚版本数怎么设? 如何探测启动成功,如何探活? 如何分配和限制资源? 如何设置时区?否则打印日志是GMT标准时间 如何 ...

  7. Dockerfile 编写

    转: https://blog.fundebug.com/2017/05/15/write-excellent-dockerfile/如何编写最佳的Dockerfile 译者按: Dockerfile ...

  8. Docker的简介以及Dockerfile编写与使用

    Docker的简介 Docker是在容器的基础上,进行了进一步的封装,极大的简化了容器的创建和维护.使得Docker技术比虚拟机技术更为轻便.快捷. 下面是两张对比图. 可以看到传统虚拟机技术是虚拟出 ...

  9. 一个简单的Makefile的编写【用自己的话,解释清楚这些】

    用自己的话,解释清楚这些~ Makefile是程序员编写出来指导编译器编译程序源码为目标文件(可执行文件,或链接库) 这里只写一个简单的Makefile 作为例子 其需求如下: frank@ubunt ...

随机推荐

  1. vue 使用中的小技巧 (一)

    在vue的使用过程中会遇到各种场景,当普通使用时觉得没什么,但是或许优化一下可以更高效更优美的进行开发.下面有一些我在日常开发的时候用到的小技巧 data 和 Object.freeze 每个Vue实 ...

  2. linux域名解析引起登陆慢

    linux域名解析引起登陆慢的问题在于,ssh去登录这个台机器的时候,本机会去通过域名解析获取登录主机的主机名,所有一旦域名解析是无效的,需要等待较长时间 解决办法一: 将域名解析指到127.0.0. ...

  3. 前端知识之HTML标签

    1.HTML是一个标准,规定了大家怎么写网页. 2.HTML->>学标签 <标签名>    -->  标记语言(HTML.XML) 3.标签分类 双标签.单标签 (1)& ...

  4. mysql之数据库备份

    1.可视化工具Navicat for mysql进行操作数据库备份 (1)备份数据库 (2)将备份的数据库进行加载

  5. 详解Java锁的升级与对比(1)——锁的分类与细节(结合部分源码)

    前言 之前只是对Java各种锁都有所认识,但没有一个统一的整理及总结,且没有对"锁升级"这一概念的加深理解,今天趁着周末好好整理下之前记过的笔记,并归纳为此博文,主要参考资源为&l ...

  6. 好学易懂 从零开始的插头DP(一)

    好学易懂 从零开始的插头DP(一) 写在前面 这是一篇,以蒟蒻视角展开的梳理总结.更改了一些顺序,变化了一些细节.方便蒟蒻学习理解(起码本蒟蒻是这样).大佬们可以直接看其它大佬的博客,可以学的更快. ...

  7. ATT&CK模型

    Credential Dumping(凭证窃取) Dump credentials from LSASS(从LSASS中窃取凭证) 实现原理: This technique injects into ...

  8. Redis 未授权访问漏洞批量提权

    一.getshell前提 ①能有对 /root/.ssh/目录写入的权限 ②目标机开启22端口 二.安装依赖 sudo easy_install redis 三.使用 redis python hac ...

  9. webug第二关:从图片中你能找到什么?

    第二关:从图片中你能找到什么? 记事本打开发现提示 binwalk,发现压缩包rar

  10. cProfile分析程序性能

    Python标准库中提供了三种用来分析程序性能的模块,分别是cProfile, profile和hotshot,另外还有一个辅助模块stats.这些模块提供了对Python程序的确定性分析功能,同时也 ...