基于 Docker 分分钟搭建起 Golang 开发环境

示例代码

假设有如下程序 hello.go

package main

import "fmt"

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

定义使用 go 语言的版本

系统变量中定义要使用的 go 语言版本,方便后期切换 go 语言版本。

export GO_VERSION=1.10

直接执行

docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:$GO_VERSION go run ./hello.go

首次运行需要下载修改的image,输出如下:

 $ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:$GO_VERSION go run ./hello.go
Unable to find image 'golang:1.10' locally
1.10: Pulling from library/golang
55cbf04beb70: Pull complete
1607093a898c: Pull complete
9a8ea045c926: Pull complete
d4eee24d4dac: Pull complete
9c35c9787a2f: Pull complete
6a66653f6388: Pull complete
102f6b19f797: Pull complete
Digest: sha256:957f390aceead48668eb103ef162452c6dae25042ba9c41762f5210c5ad3aeea
Status: Downloaded newer image for golang:1.10
Hello World!

编译

docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:$GO_VERSION go build -v

命令执行输出:

默认编译的为 Linux 版,在 Mac 下是执行失败的

$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:$GO_VERSION go build -v
_/usr/src/myapp
 $ ls
hello.go myapp
 $ ./myapp
-bash: ./myapp: cannot execute binary file

编译为 Mac 版

docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp -e GOOS=darwin -e GOARCH=amd64 golang:$GO_VERSION go build -v

命令执行输出:

 $ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp -e GOOS=darwin -e GOARCH=amd64 golang:$GO_VERSION go build -v
errors
internal/race
runtime/internal/sys
runtime/internal/atomic
sync/atomic
runtime
internal/cpu
math
internal/testlog
unicode/utf8
strconv
unicode
sync
io
syscall
reflect
time
internal/poll
os
fmt
_/usr/src/myapp
 $ ls
hello.go myapp
 $ ./myapp
Hello World!

编译为 Windows 版

docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp -e GOOS=windows -e GOARCH=386 golang:$GO_VERSION go build -v

虽然 Golang 的开发环境相对容易搭建,但是使用 docker 的优势是能方便的切换 golang 的版本,而且开发环境对开发时所使用的机器没有任何的依赖,这也为协作开发时保持开发环境的一致性提供了便利。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏linux驱动个人学习

ARM有几条memory barrier 的指令?分别有什么区别?

(1)数据存储屏障( Data Memory Barrier,DMB) 数据存储器隔离。DMB指令保证:仅当所有在它前面的存储器访问操作都执行完毕后,才提交(...

23330
来自专栏jianhuicode

构建ReactJs项目node-sass编译出错

npm run dev本地项目出错 问题栈 verbose Please try running this command again as root/Adm...

244100
来自专栏恰童鞋骚年

.NET Core微服务之基于Steeltoe使用Spring Cloud Config统一管理配置

  在分布式系统中,每一个功能模块都能拆分成一个独立的服务,一次请求的完成,可能会调用很多个服务协调来完成,为了方便服务配置文件统一管理,更易于部署、维护,所以...

22640
来自专栏世界第一语言是java

springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin

69930
来自专栏kwcode

无法向会话状态服务器发出会话状态请求

无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如...

28850
来自专栏软件工程师成长笔记

CentOS7.0 创建本地yum源和局域网yum源

这几天一直在学习在CentOS7.0创建本地yum源和局域网yum源,准备两台CentOS7.0虚拟机,一个做服务器,一个做客户端;由于开发环境只有局域网,没法...

43720
来自专栏开发与安全

linux网络编程之socket(四):使用fork并发处理多个client的请求和对等通信p2p

一、在前面讲过的回射客户/服务器程序中,服务器只能处理一个客户端的请求,如何同时服务多个客户端呢?在未讲到select/poll/epoll等高级IO之前,比较...

42500
来自专栏Laoqi's Linux运维专列

CentOS7.3 创建本地YUM源的三种方法

75740
来自专栏Hongten

oracle系列--第四篇 Oracle的卸载

对于oracle的卸载,是一件相对麻烦的事情,不像其他软件那样,我们可以根据卸载向导,就可以方便快捷地卸载软件。

13520
来自专栏微信公众号:Java团长

初识Spring Boot框架

前面的铺垫文章已经写了几篇了,主要是介绍了Spring和SpringMVC框架,小伙伴们在学习的过程中大概也发现了这两个框架需要我们手动配置的地方非常多,不过做...

11840

扫码关注云+社区

领取腾讯云代金券