V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
jicg
V2EX  ›  Go 编程语言

制作了一个“golang 制作 docker 最小镜像”的视频

  •  
  •   jicg · 2019-01-20 21:21:02 +08:00 · 4720 次点击
    这是一个创建于 2141 天前的主题,其中的信息可能已经有所发展或是发生改变。

    制作了一个构建 docker 的最小镜像的视频,上传到 B 站,分享给大家看。
    希望能帮助大家稍微了解下下 docker。
    希望大神们别喷,可以到 B 站提提建议。
    B 站地址 https://www.bilibili.com/video/av40752125

    35 条回复    2019-01-21 17:03:40 +08:00
    CallMeReznov
        1
    CallMeReznov  
       2019-01-20 21:35:05 +08:00
    楼主的舌头啊.....
    jicg
        2
    jicg  
    OP
       2019-01-20 21:41:47 +08:00
    @CallMeReznov ???普通话不标准?
    huaxianyan
        3
    huaxianyan  
       2019-01-20 22:08:48 +08:00
    @jicg 不是人身攻击,你这个普通话,通常意义的标准的确是没达到
    Vegetable
        4
    Vegetable  
       2019-01-20 22:16:21 +08:00 via iPhone
    file 读[faɪl],稍微注意一下比较好。
    当然我也是很友好的说,没别的意思。
    koodai
        5
    koodai  
       2019-01-20 22:19:51 +08:00 via iPhone
    做的挺好的,不过楼主的发音确实可以练一下,真诚建议。
    jicg
        6
    jicg  
    OP
       2019-01-20 22:55:11 +08:00 via iPhone
    @huaxianyan 嗯嗯,👌
    jicg
        7
    jicg  
    OP
       2019-01-20 22:56:01 +08:00 via iPhone
    @Vegetable 嗯嗯,好的。
    jicg
        8
    jicg  
    OP
       2019-01-20 23:02:07 +08:00 via iPhone
    谢谢,各位,还有什么不足之处,也希望大家说出来。
    azh7138m
        9
    azh7138m  
       2019-01-21 00:18:49 +08:00
    一个多阶段构建水了一个视频......
    lands
        10
    lands  
       2019-01-21 01:05:53 +08:00
    感觉用 alpine 会小好多
    sdijeenx
        11
    sdijeenx  
       2019-01-21 01:12:50 +08:00
    LZ 读英文单词别用日语发音,普通话不够标准=3=
    izoabr
        12
    izoabr  
       2019-01-21 01:36:59 +08:00
    表示对分享的支持,不便发表评论,并保留意见。
    yuikns
        13
    yuikns  
       2019-01-21 02:09:53 +08:00   ❤️ 1
    Dockerfile 听起来像是 Dark Fly,scratch 我好像听到的是 "script"?
    不看字幕中文也听不清...


    此外还有一些疑问。

    先说个无聊的,后面的 "as final" 嘎哈用的?没有也一样啊。

    首先,

    我的脚本是这样的:

    PLATFORM="$(uname -s | tr 'A-Z' 'a-z')"

    export CGO_ENABLED=0
    export GOOS=${PLATFORM}

    export BUILD_DATE=$(date '+%Y%m%d%H%M%S%Z')
    export BUILD_LDFLAGS="-X github.com/name/project/version.GitHash=$(git rev-parse HEAD | cut -c1-8) "
    export BUILD_LDFLAGS="${BUILD_LDFLAGS} -X github.com/name/project/version.BuildDate=\"${BUILD_DATE}\" "
    export BUILD_LDFLAGS="${BUILD_LDFLAGS} \"-extldflags='-static'\""

    go build -a -ldflags="$BUILD_LDFLAGS" ./cmd/my-command

    这就足以在当前目录下,从 ./cmd/my-command 寻找 main 然后生成了 binary release 了。

    我们使用 go help get 得到说明:

    Get downloads the packages named by the import paths, along with their
    dependencies. It then installs the named packages, like 'go install'.

    这个在没有 dep 时候使用一下它下载一下依赖可以理解。但是在有 dep 后为何要保留?

    其次,为啥要 copy 那些源代码目录?这远不是最小了。

    要是是配置文件,建议楼主了解下 viper。docker 里面不需要贴这些配置文件的。
    要是是静态文件,go-bindata 了解一下。
    yuikns
        14
    yuikns  
       2019-01-21 02:27:24 +08:00   ❤️ 1
    另外,了解一下 vendor 目录 https://blog.gopheracademy.com/advent-2015/vendor-folder/

    目前有很多依赖管理工具。无论形式怎么变化,只要是缓存代码到本地到,其实就是在当前工程下的 vendor 目录下。

    这些工具只有在解析代码时候有用,在 build image 时候并没有用到。

    我不明白为啥还要 get 一下 godep。
    jicg
        15
    jicg  
    OP
       2019-01-21 07:32:36 +08:00 via iPhone
    @azh7138m 好吧
    jicg
        16
    jicg  
    OP
       2019-01-21 07:39:22 +08:00 via iPhone
    @yuikns 源码复制过去只是为了编译用的,再二次构建的时候,只是把需要的文件复制到镜像里面,就是起了别名 final 的那次构建,
    jicg
        17
    jicg  
    OP
       2019-01-21 07:41:24 +08:00 via iPhone
    @yuikns 没有 get 啊, 视频里面有讲把 go get 注释掉了啊
    jicg
        18
    jicg  
    OP
       2019-01-21 07:52:10 +08:00 via iPhone
    @yuikns go get godep 的包,是为了安装 godep,借用 godep 来编译的,因为我也试过直接,可能我当时测有问题吧,go build 还是会在镜像,提示包不存在的,所以 builder 构建步骤里面安装了 godep
    jicg
        19
    jicg  
    OP
       2019-01-21 07:57:08 +08:00 via iPhone
    @lands 嗯嗯,alpine 才 4m 左右
    jicg
        20
    jicg  
    OP
       2019-01-21 07:57:56 +08:00 via iPhone
    @koodai 谢谢,
    jicg
        21
    jicg  
    OP
       2019-01-21 08:09:38 +08:00 via iPhone
    @yuikns go-bindata 这个工具,我知道。他只是将静态文件打包到程序里面,得到的最终文件也不小,我一般用 upx 工具对他再压缩。
    jicg
        22
    jicg  
    OP
       2019-01-21 08:56:59 +08:00
    @yuikns 我又测了下,不需要 godep 也是可以的。谢谢
    yuikns
        23
    yuikns  
       2019-01-21 10:33:04 +08:00
    @jicg 我是说

    COPY --from=builder go/src/github.com/xxx/views /app/views
    COPY --from=builder go/src/github.com/xxx/conf /app/conf

    这一挂。
    jicg
        24
    jicg  
    OP
       2019-01-21 11:22:47 +08:00 via iPhone
    Beego 的基础项目,views 是存放页面模板文件的啊,必须要复制过去的吧,conf 是放配置文件的地方,也是需要的
    jicg
        25
    jicg  
    OP
       2019-01-21 11:23:06 +08:00 via iPhone
    @yuikns Beego 的基础项目,views 是存放页面模板文件的啊,必须要复制过去的吧,conf 是放配置文件的地方,也是需要的
    artandlol
        26
    artandlol  
       2019-01-21 11:35:30 +08:00 via iPhone
    肯定用 alpine,现在都是主流了。
    jicg
        27
    jicg  
    OP
       2019-01-21 11:50:58 +08:00
    @artandlol scratch 比 alpine 小,用 alpine 的多
    yuikns
        28
    yuikns  
       2019-01-21 11:54:10 +08:00
    @jicg 所以我才说

    > 要是是配置文件,建议楼主了解下 viper。docker 里面不需要贴这些配置文件的。
    > 要是是静态文件,go-bindata 了解一下。

    配置文件你要是需要默认值,那配置下 default。要是不是,config ( https://docs.docker.com/compose/reference/config/ ) 或者 etcd 才是最终归宿。
    imherer
        29
    imherer  
       2019-01-21 11:54:25 +08:00
    IDE 用的 JB 家的哪个?
    yuikns
        30
    yuikns  
       2019-01-21 11:59:16 +08:00
    @imherer 要是还写 scala/java/... 的话,不要 goland。和 idea + go plugin 没区别
    artandlol
        31
    artandlol  
       2019-01-21 12:34:03 +08:00 via iPhone
    @jicg 那个几乎是空镜像吧
    jicg
        32
    jicg  
    OP
       2019-01-21 12:43:27 +08:00 via iPhone
    @artandlol 嗯嗯,是的
    jicg
        33
    jicg  
    OP
       2019-01-21 14:03:18 +08:00
    @yuikns 嗯嗯,好的。
    go-bindata 我是知道的,用与不用,看个人爱好吧,我觉得 docker 没必须,将静态文件打包到可执行程序内部。go-bindata 的作者好像已经不再维护这个项目了。
    viper 这个框架是配置文件的框架,非常好的框架,谢谢,分享。我用的是 beego 的项目来演示的,而 beego 配置文件可以设定取系统环境变量的值的,所以将 conf 文件复制过去没问题的。
    yesono
        34
    yesono  
       2019-01-21 16:36:33 +08:00
    golang 基础环境( alpine+glibc+改时区)+add go 二进制就可以了吧
    ···
    FROM alpine:latest
    # Install base packages
    RUN apk update && apk --no-cache add tzdata ca-certificates wget zlib libgcc \
    && cp -r -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    RUN wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://raw.githubusercontent.com/sgerrand/alpine-pkg-glibc/master/sgerrand.rsa.pub && wget http://mirrors.lo
    ngzhu.cn/src/glibc-2.28-r0.apk && apk add glibc-2.28-r0.apk && rm -f glibc-2.28-r0.apk /etc/apk/keys/sgerrand.rsa.pub
    ···
    jicg
        35
    jicg  
    OP
       2019-01-21 17:03:40 +08:00
    @yesono 这个方案非常好,好多人都是这样干的,将程序需要的文件压缩成 zip 文件,发布到网络上(如在 github 上发版),然后 docker 里面直接下载文件,解压出来,就可以了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   938 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:11 · PVG 05:11 · LAX 13:11 · JFK 16:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.