在新流水线使用 Go 应用演示
目标:在DaoCloud上搭建一个 Golang 应用,本项目代码维护在 DaoCloud/golang-mysql-sample 项目中。您可以在 GitHub 找到本项目并获取本文中所提到的所有代码文件。
前言
Golang 作为一门日渐流行的语言,凭借轻量级,使用简单的 Gorouting 以及 高质量的标准库, 成为了分布式系统中最流行的编程语言。这里将通过 一个简单的 Golang 项目 使其容器化,让大家掌握基础的 Docker 使用方法。
Docker 化应用的关键元素
- 镜像是 Docker 应用的静态表示,是应用的交付件,镜像中包含了应用运行所需的所有依赖:包括应用代码、应用依赖库、应用运行时和操作系统。
- Dockerfile 是一个描述文件,描述了产生 Docker 镜像的过程,详细文档可以参见官方文档 Dockerfile reference。
- 容器是镜像运行时的动态表示,如果把镜像想象为一个 Class 那么容器就是这个 Class 的一个实例。
一个应用 Docker 化的第一步就是通过 Dockerfile 产生应用镜像。
编写 Dockerfile
FROM Golang:1.8 MAINTAINER Captain Dao <support@daocloud.io> RUN mkdir -p /app WORKDIR /app ADD . $GOPATH/src/app RUN go get app RUN CGO_ENABLED=0 go install -a app EXPOSE 80 ENTRYPOINT ["app"] CMD [""]
ADD
与 COPY
的区别:
总体来说 ADD
和 COPY
都是添加文件的操作,其中 ADD
比 COPY
功能更多,ADD
允许后面的参数为 URL,还有 ADD
添加的文件为压缩包的话,它将自动解压。
使用 RUN
命令调用 go get 让Golang 工具链安装依赖
在编写 Dockerfile 时尽量将安装依赖的过程提前以提高镜像层的复用率
一般我们会将初始化应用的过程编写成一个启动脚本,在脚本里以环境变量或命令行参数的形式获取应用初始化所必须的信息,然后配置并启动应用。
通过指令启动容器
有了 Dockerfile 以后,我们可以运行下面的命令构建 Python 应用镜像并命名为 ipython/notebook
:
通过指令建立镜像
docker build -t golang-sample .
通过以下指令启动容器
docker run -d -p 8888:8888 -e PASSWORD=admin golang-sample
通过 DaoCloud 进行构建镜像和部署应用
创建项目
1.通过 fork DaoCloud/golang-mysql-sample 绑定代码源或者通过 Git 地址进行代码源设置
2.“代码构建”、“创建项目”选择之前 fork 的代码仓库(repo)或者通过 Git 地址进行代码源设置,点击 开始创建
设置流水线
初次使用时,我们为您创建了“测试”、“构建”两个阶段便于快速开始。流水线会从左到右依次执行,阶段内的任务为并发。按照此例会先并发执行“测试”下的所有任务,任务全部完成后再执行“构建”下的所有任务。如果需要编辑任务,点击卡片右上角的选项 并选择“编辑任务”。根据需求自定义设置,完成设置后,可以通过 commit 代码,或在界面右上角选择“现在触发” 然后选择“master” 分支并点击“确定”来触发流水线。
- 添加阶段:点击阶段右边 可以自己定义一个阶段,例如添加一个发布阶段
- 添加并行任务:可以根据需要选择添加并行任务, 我们这里选择 Golang测试 任务
- 编辑任务:对此任务进行设置 ,详细如下:
Golang 测试任务:
1. 根据实际包名来设置红框,以便于脚本将包存入GOPATH下。
2. 此外因为我们测试需要连接 MySQL, 因此附加了一个 MySQL 实例,该实例将在测试结束后自动销毁。
构建任务:
很多时候,我们只希望我们交付的镜像中存在打包编译最后的产物,而由于 Docker Image 设计的问题,中间产物即使在构建后删除,其实仍然驻留在之前的Layer之中(类似标记删除)。这个时候我们就需要用到安全构建(两步构建)。
安全构建需要两个 Dockerfile,分别指代了编译和打包的过程。
再次之间,我们必须指定需要提取的路径,这个路径下下的文件将会加入第二次构建的上下文之中,以便第二次构建通过 ADD/COPY 命令复制进入镜像。
设置完毕后Push代码或者手动触发一次流水线,就能看见测试和构建的结果了!
以上是基于 Golang 应用的流水线基本设置,其他应用的流水线设置请参考相关文档。
相关设置的 daocloud.yml 可以在实例代码中找到,可以快速编辑云端 yaml 以导入设置。