以alpine作为基础镜像构建Golang可执行程序操作

 更新时间:2020年12月22日 09:52:17   作者:思维的深度  
这篇文章主要介绍了以alpine作为基础镜像构建Golang可执行程序操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

Alpine介绍

Alpine 操作系统是一个面向安全的轻型 Linux 发行版。它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功能上比 busybox 又完善的多,因此得到开源社区越来越多的青睐。在保持瘦身的同时,Alpine 还提供了自己的包管理工具 apk,可以通过 https://pkgs.alpinelinux.org/packages 网站上查询包信息,也可以直接通过 apk 命令直接查询和安装各种软件。

Alpine 由非商业组织维护的,支持广泛场景的 Linux发行版,它特别为资深/重度Linux用户而优化,关注安全,性能和资源效能。Alpine 镜像可以适用于更多常用场景,并且是一个优秀的可以适用于生产的基础系统/环境。

Alpine Docker 镜像也继承了 Alpine Linux 发行版的这些优势。相比于其他 Docker 镜像,它的容量非常小,仅仅只有 5 MB 左右(对比 Ubuntu 系列镜像接近 200 MB),且拥有非常友好的包管理机制。官方镜像来自 docker-alpine 项目。

目前 Docker 官方已开始推荐使用 Alpine 替代之前的 Ubuntu 做为基础镜像环境。这样会带来多个好处。包括镜像下载速度加快,镜像安全性提高,主机之间的切换更方便,占用更少磁盘空间等。

下表是官方镜像的大小比较:

REPOSITORY   TAG   IMAGE ID   VIRTUAL SIZE
alpine    latest  4e38e38c8ce0  4.799 MB
debian    latest  4d6ce913b130  84.98 MB
ubuntu    latest  b39b81afc8ca  188.3 MB
centos    latest  8efe422e6104  210 MB

Alpine和其他通用Linux发行版对于Golang编译出来的可执行文件要求有所不同,Alpine要求可执行文件必须是静态链接的可执行文件。

所以在编译Golang时需要添加 -tags netgo ,来生成静态链接的可执行文件。

示例:

代码示例:每三秒控制台输出一次消息,输出100次

package main 
import (
 "fmt"
 "time"
)
 
func main() {
 for i := 0 ; i< 100 ; i++ {
 fmt.Println("hello,",i)
 time.Sleep(time.Second*3)
 }
}

编译成静态链接的可执行文件:

go build -tags netgo -o test

Dockerfile的参考内容:

FROM alpine:latest 
ADD test /usr/local/bin/
 
# Alpine Linux doesn't use pam, which means that there is no /etc/nsswitch.conf,
# but Golang relies on /etc/nsswitch.conf to check the order of DNS resolving
# (see https://github.com/golang/go/commit/9dee7771f561cf6aee081c0af6658cc81fac3918)
# To fix this we just create /etc/nsswitch.conf and add the following line:
RUN echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf
WORKDIR /usr/local/bin/
 
CMD ["test"]

构建镜像、运行容器即可

补充:编译后的go程序无法在alpine基础镜像创建的容器运行问题

问题描述:

我要使用容器创建一个使用golang的http的服务,为了不让镜像太大,所以选择了基础镜像alpine,才几m,但把go的程序编译之后无法在容器中运行,解决办法是在编译go程序时,加上参数​-tags netgo。

具体做法如下:

1、首先下载apline基础镜像:

docker pull docker.io/alpine

2、编译go程序:(我的程序是sensor.go,编译之后放在sensors目录下)

go build -tags netgo -o sensors/sensor sensor.go

3、dockerfile文件,保存为sensor:

FROM docker.io/alpine:latest

MAINTAINER weinengl

# 拷贝相关文件。

COPY sensors/sensor /tmp/

RUN chmod +x /tmp/sensor

ENTRYPOINT ["/tmp/sensor"]

4、镜像制作命令:

docker build -t reg.netlab.com/temperature:v1 -f sensor .

制作完成之后运行即可:

docker run -itd -p 8881:8881 --name test10 reg.netlab.com/temperature:v1

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • Go中log包异或组合配置妙用详解

    Go中log包异或组合配置妙用详解

    在 Go 语言的 log 包中,使用“位运算相或” (|) 来配置日志的 flag,可以让我们灵活地组合多种日志信息输出选项,下面我们就来看看这种方法的好处和原理吧
    2024-11-11
  • Golang 如何判断数组某个元素是否存在 (isset)

    Golang 如何判断数组某个元素是否存在 (isset)

    这篇文章主要介绍了Golang 如何判断数组某个元素是否存在 (isset),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • go实现for range迭代时修改值的操作

    go实现for range迭代时修改值的操作

    这篇文章主要介绍了go实现for range迭代时修改值的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go中如何使用set的方法示例

    Go中如何使用set的方法示例

    这篇文章主要介绍了Go中如何使用set的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • go语言中slice,map,channl底层原理

    go语言中slice,map,channl底层原理

    这篇文章主要介绍了go语言中slice,map,channl底层原理,slice,map,channl是我们Go语言中最最常用的几个数据结构,对于其更多相关内容需要的小伙伴可以参考下面文章详细内容
    2022-06-06
  • 解决golang json解析出现值为空的问题

    解决golang json解析出现值为空的问题

    这篇文章主要介绍了解决golang json解析出现值为空的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 详解Go语言RESTful JSON API创建

    详解Go语言RESTful JSON API创建

    这篇文章主要介绍了详解Go语言RESTful JSON API创建,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Go语言开发区块链只需180行代码(推荐)

    Go语言开发区块链只需180行代码(推荐)

    这篇文章主要介绍了Go语言开发区块链只需180行代码,文章中将不会涉及工作量证明算法(PoW)以及权益证明算法(PoS)这类的共识算法。需要的朋友可以参考下
    2018-05-05
  • golang chan传递数据的性能开销详解

    golang chan传递数据的性能开销详解

    这篇文章主要为大家详细介绍了Golang中chan在接收和发送数据时因为“复制”而产生的开销,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2024-01-01
  • Go语言使用sqlx操作数据库的示例详解

    Go语言使用sqlx操作数据库的示例详解

    sqlx 是 Go 语言中一个流行的第三方包,它提供了对 Go 标准库 database/sql 的扩展,本文重点讲解 sqlx 在 database/sql 基础上扩展的功能,希望对大家有所帮助
    2023-06-06

最新评论