首页 > 编程语言 >Docker Go语言程序的编译与打包

Docker Go语言程序的编译与打包

时间:2022-09-05 09:45:06浏览次数:67  
标签:src sudo 编译 go Go 镜像 Docker docker 打包

使用Docker打包Go程序的镜像

Golang镜像

首先使用docker pull获取golang镜像

$ sudo docker pull golang:1.18.3

查看镜像:

$ sudo docker image ls
golang           alpine    d0f5238dcb8b   3 weeks ago     352MB

在docker中运行go指令,查看go版本

$ sudo docker run -it --rm d0f go version
go version go1.19 linux/amd64

进入该镜像,查看目录结构:

$ sudo docker run -it --rm d0f sh
/go # ls -l
total 8
drwxrwxrwx    2 root     root          4096 Aug  9 19:12 bin
drwxrwxrwx    2 root     root          4096 Aug  9 19:12 src
/go # cd /
/ # ls
bin    etc    home   media  opt    root   sbin   sys    usr
dev    go     lib    mnt    proc   run    srv    tmp    var

打包Go程序

先简单的打包一个go语言程序,使用docker将其打包

代码如下:

package main

import "fmt"

func main() {
	fmt.Println("Hello World")
}

编写对应Dokerfile:

FROM golang:1.8.3
WORKDIR /go/src
ADD . /go/src
RUN cd /go/src && go build -o main
CMD ["/go/src/main"]

使用FROM命令,表明将基于golang来构建镜像,WORKDIR设置工作目录,将当前项目的根目录拷贝到src目录,之后RUN编译源代码,最后CMD执行程序

单纯构建

先实行简单构建,如下所示,将这个镜像命名为docker-go,版本号为1.0

$ sudo docker image build -t docker-go:v1 .

打包完毕后,使用docker run运行:

$ sudo docker run -it --rm docker-go:v1
Hello World

该镜像的大小高达700MB,显然可以更小的打包

分阶段构建

使用分阶段构建,谋求更小体积的镜像

在上述构建过程中,可以分为编译阶段和打包阶段

对于编译阶段后,在编译源代码结束后,源代码和环境都不需要

对于打包阶段,基于一个apline镜像,将编译好的镜像复制到apline镜像上

改写Dockerfile:

FROM golang:1.8.3 As buildStage
WORKDIR /go/src
ADD . /go/src
RUN cd /go/src && go build -o main

FROM alpine:latest
WORKDIR /app
COPY --from=buildStage /go/src/main /app/
ENTRYPOINT ./main

使用WORKDIR命令设置工作目录,接着使用COPY命令将编译好的程序复制到新的路径下,使用ENTRYPOINT设置一个入口点

$ sudo docker image build -t docker-go:v2 .

执行该命令进行打包,再次查看镜像大小:

$ sudo docker image ls
docker-go        v2        a6b029a1d5d7   39 seconds ago   7.08MB

这次只有7MB多,并且成功运行:

$ sudo docker run -it --rm docker-go:v2 
Hello World

标签:src,sudo,编译,go,Go,镜像,Docker,docker,打包
From: https://www.cnblogs.com/N3ptune/p/16656994.html

相关文章

  • MongoDB学习(二)
    MongoDB基本操作查看数据库语法:showdatabases选择数据库语法:use数据库名注意:在MongoDB中选择不存在的数据库不会报错,后期当该数据库有数据时,系统会自动创建,这叫隐......
  • [教程]:使用 FastAPI 和 Docker 提供容器化 ML 模型
    [教程]:使用FastAPI和Docker提供容器化ML模型使用FastAPI和docker提供容器化机器学习(ML)模型的分步教程。Ourtechstackforthetutorial在我的**以......
  • GO语言自学_005_类的嵌套_类的继承
    packagemainimport"fmt"//定义一个Human类typeHumanstruct{//属性namestringageintgenderstring}//定义一个学生类嵌套Human类typ......
  • stm32f103zet红牛开发板STMcubeMX hal库版:03旺宝-红牛-蜂鸣器 SysTick应ongoi
    程序运行后,蜂鸣器发出类似报警声.蜂鸣器在  pb2上接着。这是一个无源蜂鸣器。不是给电就响。得给一定频率的信号才行。这里用定时器跟gpio生成一定频率的方波。  ......
  • docker的重启策略
    docker的重启策略docker容器是重启策略是在配置中的一个重要的策略。docker容器的重启都是有docker的守护进程完成的,因此与守护进程息息相关docker容器的重启策略如下:n......
  • 记录一次go打印金字塔,空心金字塔
    金字塔packagemainimport"fmt"//案例说明:用户输入金字塔高度,打印金字塔funcmain(){//思路整理://需要获得的数据//1.获得金字塔高度......
  • docker访问外部https数字证书问题
    一般我们构建的docker镜像使用的都是alpinelinux系统,默认是不带ca-certificates根证书的,导致无法识别外部https携带的数字证书。在访问的时候,会抛出509:certific......
  • docker的常用命令
    docker的常用命令直接敲击docker,可以看到帮助信息   1,查看docker的命令帮助信息dockersearch--help2,常用命令概要1下载镜像:dockerpullnginx:1.21.12......
  • Docker 部署
    部署docker1.关闭防火墙systemctlstopfirewalldsystemctldisablefirewalld2.停用并禁用selinux查看:getenforce临时禁用:setenforce0查看配置文件:grep^SELI......
  • Docker 本地安装常用应用
    docker启动容器设置自启动加上配置:--restart=always比如:dockerrun-tid--name【定义容器名称】-p8081:8080--restart=always【镜像名称】如果是已经启动的容器......