更方便的在微信公众号阅读文章可以关注公众号:海生的go花园
image.png

一、go打包而进驻文件

1、安装go环境

我们可以从官方 https://go.dev/dl
下载对应系统的go安装文件。
我这里是 mac系统,x86架构,所以我选择了
image.png
安装完成后执行一下 go version 输出如下:

go version go1.19.7 darwin/amd64

2、新建一个实验目录

mkdir hello && cd hello && touch main.go

3、打开main.go 补充代码

package main

func main() {
    println("hello world , hi")
}

4、build打包一个可执行二进制文件 hello

go build -o hello ./main.go

此时我们用tree命令查看一下目录:

➜  hello git:(master) ✗ tree
.
├── hello
└── main.go

0 directories, 2 files

生成了一个 hello的二进制可执行文件
image.png

5、执行一下

➜  hello git:(master) ✗ ./hello                    
hello world , hi

二、本地打包的环境与版本以及各种依赖问题

我们发现,在这里,我们打包的时候,首先下载了 go的环境。
如果我们是一个团队,有很多成员,那么首先就需要每个人的环境,都得一致,
这样打包后的文件才能一样。
如果go版本不一致的话,那么比我的事1.14,其他热的1.19,如果用了新的方法,他在本地发现能用,但同样的代码,到我这就不能用了。

三、docker打包

如果大家都用docker打包,在docker里面配置一样的环境和版本,就可以解决上面的问题。
我们先把 hello 这个文件删掉,只留下 main.go,如下:

➜  hello git:(master) ✗ tree                       
.
└── main.go

0 directories, 1 file

image.png

1、生成Dockerfile文件

touch Dockerfile

2、安装打包go的开发环境与版本

一般第一行,我们先构建环境,我们要执行go的代码,那么第一步需要安装go环境。
通过 FROM 的语法如下:

FROM [--platform=<platform>] <image> [AS <name>]

FROM指令初始化一个新的构建阶段并为后续指令设置 基本镜像。因此,有效Dockerfile必须以FROM指令开始。镜像可以是任何有效的镜像——从公共存储库中提取镜像特别容易。
在Dockerfile增加如下代码:

#go环境
FROM golang:1.19

3、把需要执行的文件复制到docker内

我们使用WORKDIR指令在docker内新建一个目录,
然后再使用COPY指令把本地需要执行的代码,复制到docker内。

#go环境
FROM golang:1.19

# 在容器内设置 /hello 为当前工作目录
RUN mkdir /hello
WORKDIR /hello
# 把文件复制到当前工作目录
COPY . .

4、执行go build 生成二进制打包文件

我们增加一个 RUN 指令来在 docker中,执行命令
在Dockerfile修改代码变成如下:

#go环境
FROM golang:1.19

# 在容器内设置 /hello 为当前工作目录
RUN mkdir /hello
WORKDIR /hello
# 把文件复制到当前工作目录
COPY . .

#执行go build生成二进制打包文件hello
RUN go build -o hello ./main.go

这样我们就在 docker内的 /hello目录下,生成了一个 hello的二进制执行文件。

5、生成对外可供docker run 执行 命令

如同在本地运行的时候,命名加到环境变量中医院。
我们这里使用 ENTRYPOINT指令

ENTRYPOINT ["executable", "param1", "param2"]   // 这是 exec 模式的写法,注意需要使用双引号
#go环境
FROM golang:1.19

# 在容器内设置 /hello 为当前工作目录
RUN mkdir /hello
WORKDIR /hello
# 把文件复制到当前工作目录
COPY . .

#执行go build生成二进制打包文件hello
RUN go build -o hello ./main.go

# docker run 时执行命令
ENTRYPOINT ["./hello"]

之所以是 "./hello" 而非是 "hello"是因为,我们是在当前的目录下的二进制文件。

6、构建docker镜像

如上,我们已经把 Dockerfile 相关的配置好。
在Dockerfile同级目录,执行docker build 生成镜像
语法如下:最后的 . 代表本次执行的上下文路径。

$ docker build -t hello .

这个命名会自动寻找同名目录下的Dockerfile文件,并执行。

此时我们查看一下docker image 发现已经生成了 一个 hello镜像

➜  hello git:(master) ✗ docker image ls | grep hello

输出:

hello     

或者从docker客户端上搜索如下:
image.png

7、执行,使用这个镜像

我们使用docker run 来执行镜像

➜  hello git:(master) ✗ docker run hello       

输出:

hello world , hi

8、推送到远程镜像存储

本地执行命令给镜像打标签

➜ docker tag hello registry.cn-beijing.aliyuncs.com/hishengg/hello:v1

本地执行命令推送到远程镜像

➜ docker push registry.cn-beijing.aliyuncs.com/hishengg/hello:v1

9、到远程仓库查看验证

登入到阿里云
https://cr.console.aliyun.com...
可以查看到我们刚才推送的镜像
image.png
点击镜像版本,可以查看详情
image.png

谢谢您的观看,欢迎关注我的公众号。

image.png


海生
104 声望34 粉丝

与黑夜里,追求那一抹萤火。