在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
前言 之前给大家介绍了关于在docker中部署golang项目的相关内容,对大家的入门具有一定的参考价值,本文将会给大家介绍如何使用docker打包一个golang编写的应用程序,最终的产物就是一个Dockerfile文件,可别小瞧这短短几行代码,涉及的知识点可不少,接下来我们就仔细剖析一下吧。 FROM golang:alpine ADD src /go/src RUN go install -v test ENTRYPOINT ["/go/bin/test"] CMD ["-logtostderr"] 1. 基础镜像选择 第一行是指定一个基础镜像,在此基础上创建我们的镜像,此处使用的是golang:alpine版本, 2. 映射代码文件并安装 使用 ADD src /go/src 将主机scr文件映射到/go/src目录下,为什么非得是这个/go/src这个目录呐?没错就是上面的GOPATH环境变量的路径,因为我们后面需要执行go install命令进行安装,否则的话就需要重新设置GOPATH才能安装编译后的二进制文件。 需要注意的是:此时本地主机中src目录中文件的组织,要执行 . ├── Dockerfile └── src ├── github.com │ └── golang │ └── glog │ ├── glog_file.go │ ├── glog.go │ ├── glog_test.go │ ├── LICENSE │ └── README └── test └── main.go 还有一个小tips是程序的日志库使用的是第三方开源的glog,当我们使用git对我们上述代码进行版本管理的时候就不需要重复包含glog的代码,直接添加一个对其的引用就可以,这样有很多好处,当库中代码被修改后可以直接更新到远程的代码仓库中,在clone的时候可以自动导入该库,也就是说在本地会拉取具体的代码,但是在远程仓库只是保存引用。 可以通过命令生成glog这个子模块: 关于命令更多的介绍参见 Git。 组织好文件结构就可以进行 3.更进一步:提前编译 上面的方式是将代码拷贝进基础镜像并在其内部编译,毫无疑问的是golang:alpine中包含一系列程序运行的依赖,程序运行会动态加载这些库,我们可以用ldd命令查看所生成的二进制文件的依赖: linux-vdso.so.1 => (0x00007ffc5b1e4000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f50a1f13000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f50a1b4a000) /lib64/ld-linux-x86-64.so.2 (0x00005611a4b0a000) 那么问题来了? 如果将这些依赖静态编译至可执行文件中那就不需要在环境中保存这些多余的信息了,就可以创建一个更小的镜像了。幸运的是无论是golang的编译机制还是docker的基础镜像都提供这样的实现: 使用命令生成静态编译的二进制文件: 此时用ldd查看生成的可执行文件的依赖,可以看到显示 重新编写的Dockerfile如下: FROM scratch ADD main / ENTRYPOINT ["/main"] CMD ["-logtostderr"] 执行 在实际情况中有时会将两种情况结合使用,先在一个镜像中构建,在另一个镜像中执行。下面的Dockerfile摘自prometheus这个第三方监控的演示案例的Dockerfile,可以看到它是首先在builder镜像中下载对应的依赖并且编译程序,最后在scratch基础镜像中执行程序。 # This Dockerfile builds an image for a client_golang example. # # Use as (from the root for the client_golang repository):jingx # docker build -f examples/$name/Dockerfile -t prometheus/golang-example-$name . # Builder image, where we build the example. FROM golang:1.9.0 AS builder WORKDIR /go/src/github.com/prometheus/client_golang COPY . . WORKDIR /go/src/github.com/prometheus/client_golang/prometheus RUN go get -d WORKDIR /go/src/github.com/prometheus/client_golang/examples/simple RUN CGO_ENABLED=0 GOOS=linux go build -a -tags netgo -ldflags '-w' # Final image. FROM scratch LABEL maintainer "The Prometheus Authors <[email protected]>" COPY --from=builder /go/src/github.com/prometheus/client_golang/examples/simple . EXPOSE 8080 ENTRYPOINT ["/simple"] 参考 Building Minimal Docker Containers for Go Applications 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对极客世界的支持。 |
请发表评论