slimage:为 Go 语言应用创建最小化的 Docker 镜像

BarP81 8年前
   <h2><strong>slimage</strong></h2>    <p>为 Go 语言应用创建最小化的 Docker 镜像。</p>    <h2><strong>背景</strong></h2>    <p>Docker 已经使得发布应用到服务器的流程简单了很多。</p>    <p>在我们创建 Docker 镜像的过程中,最直接的方法是从包含 Go 的镜像开始,把源码 ADD 到里面,编译,生成镜像,但是这个过程中有两个问题:</p>    <ul>     <li>镜像通常会比较大,~500MB;</li>     <li>连同源码也一起打包到镜像内部。</li>    </ul>    <p>网上有很多文章提到的了如何为 Go 应用建立一个非常紧凑的 Docker 镜像。受到 Nick Gauthier 和 Adriaan 的想法的启发,我们开发了 slimage,一个命令行工具,使得这个过程更加简单易用。使用 slimage,我们支持编译带或不带 Cgo 支持的 Go 应用,最终的镜像大小为 ~25MB (包含一些命令行调试工具)。</p>    <p>slimage 是一个 Bash 应用。我们同时还提供一个 windows cmd 的版本。</p>    <h2><strong>用法</strong></h2>    <p>linux/mingw 或者 mac上:</p>    <pre>  <code class="language-dockerfile">$ git clone https://github.com/hesion3d/slimage.git  $ cd slimage  slimage$ export GOPATH=`pwd`/demo  slimage$ ./run.sh -f demo-config.sh -l min -n hello-slimage  Prepare for building...  Building src...  Analyzing ELF files...  Building...  Sending build context to Docker daemon 8.127 MB  Step 1 : FROM scratch   --->   Step 2 : COPY . /   ---> Using cache   ---> 8c143d09beb3  Step 3 : ENTRYPOINT /opt/bin/hello-slimage --server_ip=0.0.0.0   ---> Using cache   ---> 422adde5b9af  Successfully built 422adde5b9af    slimage$ docker run --rm -p 8080:80 hello-slimage</code></pre>    <p>windows上:</p>    <pre>  <code class="language-dockerfile">run.bat -f demo-config.sh -l min -n hello-slimage</code></pre>    <h2><strong>大致原理</strong></h2>    <p>网上很多文章提到在 Docker 容器中使用 Docker 生成镜像,我们没有这么做。slimage 在 Docker 容器中编译 Go 源码。然后:</p>    <ol>     <li>找到要打包的可执行文件 (ELF 格式) 的依赖关系</li>     <li>整理好完整的 linux 路径,将所有需要的文件,包括被依赖的库放到对应目录</li>     <li>把该目录从容器中拷贝出来</li>     <li>在容器外把刚刚整理好的文件树生成 Docker 镜像</li>    </ol>    <h2><strong>参考</strong></h2>    <ol>     <li><a href="/misc/goto?guid=4959725778424682471" rel="nofollow,noindex">Building Minimum Docker Containers for Go Applications</a> .</li>     <li><a href="/misc/goto?guid=4959725778506476145" rel="nofollow,noindex">Create the Smallest Possible Docker Container</a> .</li>    </ol>    <p> </p>    <p>来自:https://github.com/hesion3d/slimage/blob/master/README.zh_CN.md</p>    <p> </p>