使用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

Docker Go语言程序的编译与打包的更多相关文章

  1. C语言程序经过编译链接后形成二进制映像文件的组成

    C语言程序经过编译链接后形成二进制映像文件由栈,堆,数据段,代码段组成,其中数据段又分为:只读数据段,已经初始化读写数据段,未初始化数据段(BSS段).如下图所示: 1.栈区(stack):由编译器自 ...

  2. 窥探C语言程序的编译、链接与.h文件

    概述 C语言程序从源文件经过编译.链接生成可执行文件.那么编译与链接分别做了什么? 开发中为什么使用.h编写函数的声明?接下来使用案例说清楚为什么这样编写代码. C语言程序的编译和链接 C语言程序从源 ...

  3. iOS_02_第一个C语言程序(理解编译、连接、运行)

    一.开发工具的选择 1. 可以用来写代码的工具:记事本.ULtraEdit.Vim.Xcode等. 2. 选择XCode的原因:苹果公司官方提供的开发利器.简化开发的工程.有高亮显示功能. 3. 使用 ...

  4. 写好的mapreduce程序,编译,打包,得到最后的jar包! 验证jar包 ! 整体流程

    创建一个bin目录,用于存放编译.java文件产生的.class等结果,然后编译! 编译结果! 打包操作! 打包结果! 验证打包生成的jar包,是否正常,验证成功!!!!!!!!!!!! 结果正确!! ...

  5. Android应用程序资源的编译和打包过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8744683 我们知道,在一个APK文件中,除了 ...

  6. 最短的可通过编译的C语言程序

    要求:写一个最短的,能通过编译的C语言程序,但不要求能正确运行. 一般人首先想到的是除0.即 int main() { /; } 除0会引发SIGFPE信号(浮点异常). 我们也可以删掉return, ...

  7. linux终端下 编译c语言程序

    linux终端下,编译C语言程序步骤为: 采用vi进行源代码编写,编写完成后,:wq存盘退出,如: vi test.c 在命令行下,运行gcc编译程序,生成执行码,如: gcc  -o test te ...

  8. 李洪强漫谈iOS开发[C语言-004]-开发概述程序设计语言程序编译过程

    汇编语言 指令用特定的名字来标记,这就是汇编语言 人比较容易看懂汇编语言 汇编直接和程序一一对应的 有汇编器把程序翻译成机器码 把高级语言编译成计算机识别的语言 程序编译过程 命令行 UNIX 系统中 ...

  9. 09GNU C语言程序编译

    1. C 语言程序概述 ​ GNU gcc 对 ISO 标准 C89 描述的 C 语言进行了一些扩展,其中一些扩展部分已经包括进 IOS C99 标准中.本节给出了内核中经常用到的一些 gcc 扩展语 ...

  10. Linux编译C语言程序

    1.首先安装gcc包,运行C++程序,安装gcc-c++ 包 如果没有安装的自行进行安装 2.编辑C语言程序, 打印乘法口诀表 [root@Db1 c]# vim chengfa.c 在编辑界面中,输 ...

随机推荐

  1. MPC

    Just for anyone searching for code. I found it here: https://drive.google.com/drive/folders/0BzLEHBD ...

  2. ubuntu安装matplotlib失败:Can't rollback pillow, nothing uninstalled.

    今天在ubuntu1804上面使用pip安装matplotlib,安装失败,报错如下: ---------------------------------------- Can't rollback ...

  3. Q:Win10无法访问共享文件夹。提示此用户无法登录,因为该账户当前已被禁用

    问题:当我访问同事电脑共享文件夹时,弹出如下提示框: 可以在命令提示符上ping通对方主机,但是不能访问对方文件夹 尝试解决方法(无效): 1.同时按住win+r打开运行命令框,输入gpedit.ms ...

  4. mac 安装go语言以及配置环境变量

    Go官网下载地址:https://golang.org/dl/ Go官方镜像站(推荐):https://golang.google.cn/dl/ 其他版本自己根据系统版本下载,这里只介绍mac下载 一 ...

  5. django orm性能优化

    参考: django 分页查询大表,很慢 面试小知识:MySQL索引相关 MySQL 用 limit 为什么会影响性能? 前言 orm性能优化是一件很重要的事,一般万条以上的数据都需要优化处理了. 这 ...

  6. k8s介绍和学习思路

    1. Kubernetes介绍 Kubernetes是一个完备的分布式系统支撑平台.具备完备的集群管理能力,包括多层次的安全防护和准入机制.多租户应用支撑能力.透明的服务注册和服务发现机制.内建的智能 ...

  7. 【ES6】迭代器

    简介 在 JavaScript 中,迭代器是一个对象,它定义一个序列,并在终止时可能返回一个返回值. 更具体地说,迭代器是通过使用 next() 方法实现迭代器协议的任何一个对象,该方法返回具有两个属 ...

  8. []Python][simple]Serialize data with Pickle and deserialize data from pickle

    序列化 import pickle friend = {"Dan": [20, "Lodon", 123123], "Mary" : [24 ...

  9. Python第3章 流程控制语句(第2次作业)

    实例01 判断输入的是不是黄蓉所说的数 ①使用内置的print()函数输出"今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何?",代码如下: ②使用input()函 ...

  10. 6. 基础查(会员信息) - 创建查询Web Api - 配置Table Permission

    ​ Power Portal中的Web API可以对门户页面中所有的Microsoft Dataverse实体进行创建.更新和删除操作.我们可以直接使用门户Web API对产品创建新客户.更新联系人或 ...