Docker Go语言程序的编译与打包
使用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语言程序的编译与打包的更多相关文章
- C语言程序经过编译链接后形成二进制映像文件的组成
C语言程序经过编译链接后形成二进制映像文件由栈,堆,数据段,代码段组成,其中数据段又分为:只读数据段,已经初始化读写数据段,未初始化数据段(BSS段).如下图所示: 1.栈区(stack):由编译器自 ...
- 窥探C语言程序的编译、链接与.h文件
概述 C语言程序从源文件经过编译.链接生成可执行文件.那么编译与链接分别做了什么? 开发中为什么使用.h编写函数的声明?接下来使用案例说清楚为什么这样编写代码. C语言程序的编译和链接 C语言程序从源 ...
- iOS_02_第一个C语言程序(理解编译、连接、运行)
一.开发工具的选择 1. 可以用来写代码的工具:记事本.ULtraEdit.Vim.Xcode等. 2. 选择XCode的原因:苹果公司官方提供的开发利器.简化开发的工程.有高亮显示功能. 3. 使用 ...
- 写好的mapreduce程序,编译,打包,得到最后的jar包! 验证jar包 ! 整体流程
创建一个bin目录,用于存放编译.java文件产生的.class等结果,然后编译! 编译结果! 打包操作! 打包结果! 验证打包生成的jar包,是否正常,验证成功!!!!!!!!!!!! 结果正确!! ...
- Android应用程序资源的编译和打包过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8744683 我们知道,在一个APK文件中,除了 ...
- 最短的可通过编译的C语言程序
要求:写一个最短的,能通过编译的C语言程序,但不要求能正确运行. 一般人首先想到的是除0.即 int main() { /; } 除0会引发SIGFPE信号(浮点异常). 我们也可以删掉return, ...
- linux终端下 编译c语言程序
linux终端下,编译C语言程序步骤为: 采用vi进行源代码编写,编写完成后,:wq存盘退出,如: vi test.c 在命令行下,运行gcc编译程序,生成执行码,如: gcc -o test te ...
- 李洪强漫谈iOS开发[C语言-004]-开发概述程序设计语言程序编译过程
汇编语言 指令用特定的名字来标记,这就是汇编语言 人比较容易看懂汇编语言 汇编直接和程序一一对应的 有汇编器把程序翻译成机器码 把高级语言编译成计算机识别的语言 程序编译过程 命令行 UNIX 系统中 ...
- 09GNU C语言程序编译
1. C 语言程序概述 GNU gcc 对 ISO 标准 C89 描述的 C 语言进行了一些扩展,其中一些扩展部分已经包括进 IOS C99 标准中.本节给出了内核中经常用到的一些 gcc 扩展语 ...
- Linux编译C语言程序
1.首先安装gcc包,运行C++程序,安装gcc-c++ 包 如果没有安装的自行进行安装 2.编辑C语言程序, 打印乘法口诀表 [root@Db1 c]# vim chengfa.c 在编辑界面中,输 ...
随机推荐
- [读书笔记]FDTD与YEE晶胞
截图选自Understanding the Finite-Difference Time-Domain Metho 作者是John B. Schneider 有限差分时域(FDTD)方法使用有限差分 ...
- heimaJava18_线程
Java 线程 单线程 线程(thread)是一个程序内部的一条执行路径. main方法的执行其实就是一个单独的执行路径 程序中如果只有一条执行路径,那么这个程序就是单线程的程序 多线程 多线程是指从 ...
- SAP B1如何找回被误删的许可证号
SAP B1的许可证分配记录,保存在安装目录下的B1Upf.xml文件下,如果你发现许可证用户不小心误删了, 但又不知道是哪个用户名了,打开此文件,便可发现该用户名.接下来,你只要再建立一个和误删除的 ...
- 继承和组合关系: is a & has a
继承:is-a 比如 营销人员类 和 开发人员类 都继承自 职工类,营销人员 is-a 职工.组合:has-a 比如 汽车类 包含一个 发动机类 的对象,汽车 has-a 发动机.
- 总项目的pom文件
注意修改子模块名称!!!!!!!!!!!!!!!!!!<?xml version="1.0" encoding="UTF-8"?> <proj ...
- (3)这是一个简单的html页面,请保持为字符串,完成后面的计算要求。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- win10_pyhive链接hive失败,提示:Could not start SASL
win10_pyhive链接hive失败,提示:Could not start SASL https://blog.csdn.net/weixin_45684985/article/details/1 ...
- 2019徐州网络赛 M Longest subsequence 序列自动机
题目链接https://nanti.jisuanke.com/t/41395 题意:给两个字符串,s和t,在s中求字典序严格大于t的最长子序列. 思路:分类讨论即可.先建个s的序列自动机. 1 如果有 ...
- P4555 最长双回文串 解题报告
看到回文串,于是就想到了马拉车. 马拉车可以帮我们求出每个 \(i\) 的最大扩展距离,容易得出,双回文串就是两个回文串拼一起.当然,两个回文串必须要相交,不然形不成一个字符串. 有的小可爱就会想直接 ...
- Mybatis # 与 $ 符号区别
一.区别 1.不同点: 以#{}方式传入参数,预编译时,它会将sql中的#{}替换为?,然后编译sql时,会把值两端加上 双引号.有效防止sql注入,保证数据安全. sql注入:通过把SQL命令插入到 ...