简要
使用Docker建立强大的本地开发环境。
- 实现单个启动脚本以启动环境。
- 记录开发人员应如何启动环境并运行某些特定命令(例如启动/停止应用程序)。
- 开发人员不应该对其本地计算机(Docker和编辑器除外)进行任何依赖。
- 开发人员可以将源代码从本地计算机安装到环境中,以便他们可以使用自己喜欢的编辑器编写代码,并使代码自动同步到环境中。
- 记录开发人员如何将源代码从本地计算机安装到环境中。
- 至少有一个工具可以调试应用程序。该工具应该坚固且易于使用。
- 记录开发人员在开发期间如何调试应用程序。
有关更多详细信息,请参阅此票证。
范围
在本文中,我首先介绍一个简单的脚本,启动Docker开发环境,该环境可以执行Go代码并将源代码安装到环境中,以便开发人员可以直接从本地计算机使用自己喜欢的编辑器编写代码。
实现
Base image
有了这个简单的要求,就没有必要定义一个新的Docker镜像,我golang直接使用官方图像。
docker run --rm -it --name go-restful golang
上面的命令足以在交互模式下启动容器,可以执行任何go命令。
go version -> go version go1.13 linux/amd64
挂载源代码
现在我需要将repo的源代码安装到容器中,以便我可以在容器中测试我的代码。
docker run --rm -it --name go-restful -v $PWD:/go/src/github.com/the-evengers/go-restful golang
-v或者--volume选项允许我将目录从我的本地机器$PWD(工作目录)挂载到容器内的目录/go/src/github.com/the-evengers/go-restful。虽然目录位置有点冗长,但我们必须这样做,因为它是Go所需的工作空间结构。
测试
现在让我们从本地机器创建一些脚本并进行测试。
package mainimport "fmt"func main() { fmt.Println("Hello World!")}
然后运行:
go run main.go-> Hello World!
现在,做一些改变:
package mainimport "fmt"func main() { fmt.Println("Hello World inside Docker!")}
然后,再次运行:
go run main.go-> Hello World inside Docker!
是啊!我们很高兴。
编写脚本
现在让我们将所有内容移动到一个脚本文件中scripts/start-dev.sh以隐藏所有魔法。
#!/bin/bash# Get repo absolute location for mounting into the container.local_workdir=$(cd $(dirname $(dirname "${BASH_SOURCE[0]}")) >/dev/null 2>&1 && pwd)main() { # Working directory inside the container. local container_workdir=/go/src/github.com/the-evengers/go-restful # Identifying container name. local container_name=go-restful docker run --rm -it --name $container_name --volume $local_workdir:$container_workdir --workdir $container_workdir golang}main
我在这里做了一些改进:
- 从脚本本身查找repo的绝对位置而不是使用$PWD,以便开发人员可以从任何地方运行脚本,安装仍然可以正常工作。
- 很好地声明一些变量的可读性。
完成。让我们考虑一下自动完成,调试功能!
我现在能够使用我最喜欢的编辑器编写代码并让它们在容器内运行。但是,我不能使用我的编辑器的酷功能,如自动完成,调试,运行等。让我们在下一篇文章中这样做!
您可以在此处查看本文阶段的源代码。
翻译自:https://medium.com/@phuctm97/setup-simple-go-development-environment-with-docker-b8b9c0d4e0a8