docker 中运行 go mod 管理 golang 项目及交叉编译

阿里云产品限时红包,最高 ¥1888 元,立即领取

最近在找一个将 html 转化为 md 的工具,后来发现 html2md 这个项目还不错,打算基于它做些改造。不过 html2md 是个 golang 项目,而我自己不想在电脑上安装 golang 环境,故便考虑通过 docker 来编译这个项目。以下对过程做些记录。

说明:下文中的 $go-lab 为自己电脑上的某个目录。

docker 中安装 golang 环境

下载镜像

1
docker pull golang

新建 gopath 目录及项目源码目录 projects,将在运行容器时做映射

1
2
3
4
# docker 中默认 /go 为 gopath
mkdir $go-lab/go
# 用于存放 golang 项目源码
mkdir $go-lab/projects

需要将项目源码目录与 gopath 目录分开,这是 go mod 的要求。

进入 projects 下载 html2md 项目源码

1
2
cd $go-lab/projects
git clone https://github.com/TruthHun/html2md

在 docker 容器中运行

运行容器并进入容器

1
2
cd $go-lab
docker run --rm -it -v $PWD/go:/go -v $PWD/projects:/root --name html2md golang bash

在容器中设置环境变量

1
go env -w GOPROXY=https://goproxy.cn,direct

关键:GOPROXY 代理最好要设置,因为 golang 的许多依赖是被 GFW 给墙了,不设置带来会导致依赖无法下载。

编译 go mod 管理的项目

下载依赖

1
2
3
cd /root/html2md
# 下载依赖包,内容会存放在容器内 /go/pkg/mod 目录中
go mod tidy

go mod init project_name: 用 go mod 初始化目录

go mod tidy: 会同步依赖包,添加需要的,移除多余的

go mod download:下载依赖

go clean -modcache: 清除缓存

编写 golang 项目,引用 html2md 库

1
2
3
mkdir $go-lab/demo
# 创建 html2md.go 文件
vi $go-lab/demo/html2md.go

html2md.go 文件内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package main

import (
"fmt"
"os"
"io/ioutil"
"github.com/TruthHun/html2md"
)

func main() {
args := os.Args
if args == nil || len(args) < 2 {
Usage()
return
}

input := args[1]
output := args[2]
fmt.Println("input file is: ", input, "\noutput file is: ", output)

b, _ := ioutil.ReadFile(input)
md := html2md.Convert(string(b))
ioutil.WriteFile(output, []byte(md), 0777)
}

var Usage = func() {
fmt.Println("Usagge: ---")
}

编译项目

1
go build html2md.go

编译完成后,在目录下生成 html2md 可执行文件。

测试 html2md 工具

1
html2md code.html code.md

查看是否正确生成 code.md

交叉编译

golang 提供了完备的交叉编译环境。docker 中直接通过 go build 生成的执行文件只能在 linux 环境下运行。通过交叉编译,可以很方便的编译在 mac 或者 windows 下运行的可执行文件。

1
2
3
4
# 编译 mac 可用的可执行文件,生成 html2md
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build html2md.go
# 编译 windows 下的可执行文件,生成 html2md.exe
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build html2md.go

参考

Go语言获取命令行参数

go build 不同系统下的可执行文件

五分钟用Docker快速搭建Go开发环境

golang内置包管理工具go mod简明教程

go - 使用 go mod 管理项目依赖

go安装以及使用gomod、 goland设置