使用什么docker image来运行Go程序

目前大家都是使用什么docker image来运行我们的Go程序啊,默认的golang包还是有点大,想尽量做到最小,大家有什么好的推荐吗?

已邀请:

astaxie - 创造、获取、分享、传播和应用Go

赞同来自: 7sDream niugou

@niugou @7sDream 你们这两个用法我感觉是不正确的,这个用来开发测试还行,发布的时候不建议把源码打包到image里面去。


最好是编译后的binary+小的镜像文件,看上去大家都是用原生的,alpine看上去很小,但是好像Go1.2开始依赖了CGO,而这个image不支持,但是还是可以使用netgo包来编译。大家可以详细的看看这里


http://stackoverflow.com/questions/36279253/go-compiled-binary-wont-run-in-an-alpine-docker-container-on-ubuntu-host

adolphlwq - github.com/adolphlwq

赞同来自: bozz modood


  1. 如果项目有外部依赖(比如调用linux外部命令),使用alpine,安装上相关依赖把golang binary add进去。

  2. 如果没有依赖,使用scratch,直接把binary add进去。


这里有一个例子参考:docker-minimal-go-apps

zensh - https://github.com/zensh

赞同来自: modood

直接编译 linux 版本塞到 scratch 空镜像就行了。


可参考 https://github.com/zensh/ipservice docker 镜像不到 10MB

RedMothball - Golang & Docker

赞同来自: bozz

scratch没有shell的呀,如果在容器运行时,就没办法exec进去调试了。


还是alpine吧,比二进制文件大几MB


alpine需要修复一下x64的库,然后用就好了


FROM alpine:latest
MAINTAINER zyfdegh <zyfdegg@gmail.com>

WORKDIR /root

# fix library dependencies
# otherwise golang binary may encounter 'not found' error
RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2

COPY bin/deployer /root/deployer

CMD ["./deployer"]

Archer

赞同来自: duanquanyong

我们是打包好生产的二进制直接放上去,而不是放到docker里面,感觉像Java,Node等才需要docker里面运行,因为那样对他们来说才方便。

niugou - 宁可十年不将军,不可一日不拱卒。

赞同来自:

从网上看到一个帖子中提到这个(FROM golang:1.6),也许可以试试。


http://www.open-open.com/lib/view/open1462542951394.html


补充官方地址:https://store.docker.com/images/3e4f3e51-3930-4dd8-975c-517705d9d4e7

boilingbit

赞同来自:

直接放alpine image里

7sDream - Forward.forward.

赞同来自:

codinghxl

赞同来自:

go 1.7 打出来的二进制包体积减少了20%多了

xieyanke - 职业打杂儿,业余编程……

赞同来自:

原生linux image + 编译后的 golang binary

7sDream - Forward.forward.

赞同来自:

@astaxie


我那个项目本身是开源的,所以打包的时候就没管源码了……


如果是公司的生产环境的话可以参考下 DaoCloud 的安全镜像:


http://docs.daocloud.io/ci-image-build/daocloud-yml-2-0-preview#lite_image


如果不是用 DaoCloud 的话确实需要自己抽取一下 binary files 再 deploy

bopjiang

赞同来自:

如果go编译生成目标文件是静态链接的话(statically linked),是没有任何依赖的,是不需要任何linux基础镜像的吧。
直接放一个可执行文件到image就可以了
参考: https://blog.docker.com/2016/09/docker-golang/

cloverstd -

赞同来自:

打包好二进制文件再放到镜像里去,又没啥依赖

tianzong

赞同来自:

https://github.com/hesion3d/slimage
可以看看这个项目,里面链接了两篇文章不错

songtianyi

赞同来自:

gentoo,自己编译linux

appleboy - https://github.com/appleboy

赞同来自:

用 linux 編譯出來的版本塞到 scratch 就可以了


https://github.com/appleboy/gorush/blob/master/Dockerfile

plain

赞同来自:

建议使用支持glibc的alpine镜像,比如frolvlad/alpine-glibc。

lrita

赞同来自:

设置环境变量CGO_ENABLED=0然后编译go程序,如果代码里面没有显式调用cgo的地方的话,编译出来的程序是与glibc无关的,纯静态二进制程序,然后使用busybox、scratch等构件镜像。

yang11 - 初学者

赞同来自:

这几天刚好在做相关的事,无意中发现这个项目 https://github.com/iron-io/dockers/tree/master/go
感觉不错然后自己试了下,编译好的 go 二进制程序大约14M,以这个镜像为基础,build 完成后是21.6M。相当不错,镜像中也包含了一些linux的基础命令,可以进行基本的调试,推荐使用。

knarfeh

赞同来自:

大家的做法都是编译之后放到另外一个镜像里,一般情况我们不会把源代码放到镜像里,一方面有代码泄露的危险,另一方面也会增加镜像大小。 golang 镜像太大,scratch 没有 shell 太不方便,alpine 其实挺好的,看了下刚拉下来的最新镜像只有 3.97M,其实 17.05.0-ce 版本的 docker 发布后,已经支持了 multistage build,不需要维护两个 dockerfile 这么麻烦了,docker 的官方有一个文档,也许是最佳实践

javasgl - https://javasgl.github.io/

赞同来自:

docker镜像选一个最小的空镜像,使用 upx 压缩 golang binary。两者组合起来,使最终的程序最小,编译网络发布,自动部署等. https://javasgl.github.io/compress-executables-with-upx/

myonlyzzy

赞同来自:

关于代码泄露也许都想多了,照这样说。python js java 这些不是天生就容易泄漏。如果要说防止泄漏代码,第一步应该想的是为何会泄漏image。

要回复问题请先登录注册