• 使用docker构建简约高效的镜像


    背景介绍

    最近在思考一个问题,我的golang运行到docker环境上的时候,需要安装很大依赖。思考发现我需要就是一个运行二进制的环境而已并不需要golang的编译器等等其他任何多余的。

    当前的docker镜像

    创建一个测试目录,主要会包含你的工程文件和一个dockerfile文件

    mkdir ~/dockerfileTest
    cd ~/dockerfileTest
    

    我的hello.go和Dockerfile文件如下

    CN-MAC-013:dockerfileTest frank$ cat hello.go 
    package main
    
    import (
        "fmt"
        "time"
    )
    
    func main() {
        for {
            time.Sleep(time.Second * 2)
            fmt.Println("Hello World")
        }
    }
    

    常规的dockerfile写法

    CN-MAC-013:dockerfileTest frank$ cat Dockerfile 
    From golang:latest
    
    
    WORKDIR /app/hello
    
    COPY ./ /app/hello
    
    RUN go build hello.go
    
    CMD ./hello
    

    运行构建一个镜像
    docker build -t hello-general .
    查看镜像的大小
    docker images
    可以看到如下结果:

    优化版

    首先来看dockerfile,hello.go代码不变。

    CN-MAC-013:dockerfileTest frank$ cat Dockerfile 
    From golang:latest as build-env
    
    WORKDIR /app/hello
    
    COPY ./ /app/hello
    
    RUN go build hello.go
    
    
    FROM alpine
    WORKDIR /app/hello
    COPY --from=build-env /app/hello/hello ./
    CMD ./hello
    

    通过如下方式构建

    build -t hello-best .

    查看镜像最终结果

    总结

    第二个dockerfile是从17年发布的版本中引入的一种写法,所以很多时候我们需要与时俱进学习新技术。很显然我已经落后来将近两年了,因为今天我才知道这种写法。主要参考如下这篇文章

    Using Docker Multi-stage builds during development

  • 相关阅读:
    浏览器的垃圾回收机制
    vue-router传参数的方式
    Vue插槽
    自定义事件
    vue计算属性和监听器
    vue绑定样式
    循环中使用同步请求
    小白之路 | 从小学一年级期末考试看servlet+jsp技术
    Java实现简单计算器的探索性做法
    分布式数据库NoSQL简介
  • 原文地址:https://www.cnblogs.com/landpack/p/10757350.html
Copyright © 2020-2023  润新知