美文网首页
以alpine镜像为基础将go应用部署在docker中

以alpine镜像为基础将go应用部署在docker中

作者: louhangfei | 来源:发表于2019-05-13 18:05 被阅读0次

    当用docker进行部署go应用时,我们可以选择docker中的golang镜像。

    但为了更快的启动速度和更小的磁盘占用,我们推荐以alpine镜像作为基础镜像。
    Alpine 操作系统采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功能上比 busybox 又完善的多,因此得到开源社区越来越多的青睐。

    Alpine Docker 镜像也继承了 Alpine Linux 发行版的这些优势。相比于其他 Docker 镜像,它的容量非常小,仅仅只有 5 MB 左右(对比 Ubuntu 系列镜像接近 200 MB)

    有人可能会有疑问:为什么可以采用alpine镜像呢?alpine镜像不是没有go环境吗?

    你的疑问是对的。alpine的确没有go环境。但是我们可以在编译机器中预先将代码编译成一个二进制文件,然后将该二进制文件在ADD到新的镜像中。该二进制文件的执行不依赖于go环境了,所以我们可以直接将它在alpine环境中跑起来。

    但是编译成alpine版本的过程与其他linux如centos,过程稍有不同。
    centos中编译:

    go build main.go
    

    但是编译成alpine版本则需要加

    CGO_ENABLED=0 go build main.go
    

    CGO_ENABLED
    默认情况下,Go的runtime环境变量CGO_ENABLED=1,即默认开始cgo,允许你在Go代码中调用C代码。通过设置CGO_ENABLED=0就禁用CGO了。
    Dockerfile文件内容

    FROM docker.io/alpine
    ADD ./golang/src/pro/main /go/main
    EXPOSE 9000
    CMD /go/main     
    

    通过dockerfile编译go的代码成的镜像仅有12.3M,当然这也取决于你的代码包大小.
    制作镜像代码。

    docker build -f golang/Dockerfile -t mygo11 .
    

    -f指定Dockerfile文件。最后面的.指定当前制作镜像的上下文。这个上下文和Dockerfile的ADD ./golang/src/pro/main /go/main 中第一个路径有关系。如果上下文不对的话,那么ADD时会找不到对应的路径而制作镜像失败。这里很关键。最好是将上下文和Dockerfile文件在同一目录。我这里为了学习上下文故意设置成不一样而已。

    启动容器

    docker run -d -p 9004:9000 mygo11
    

    相关文章

      网友评论

          本文标题:以alpine镜像为基础将go应用部署在docker中

          本文链接:https://www.haomeiwen.com/subject/nvpraqtx.html