我们将在CI流程中使用Docker Compose。正如你将看到的,Docker Compose在运行集群时几乎没什么用处。但是,对于要在单台机器上执行的操作,Docker Compose仍然是最简单和最可靠的方法。
Compose是定义和运行多容器Docker应用的工具。你可以使用Compose文件来配置应用的服务。然后,使用单个命令创建并启动配置中的所有服务。Compose非常适合开发、测试和预备环境以及CI工作流程。
之前克隆的代码库已经包含docker-compose-test-local.yml中定义的所有服务(https://github.com/vfarcic/go-demo/blob/m aster/docker-compose-test-loc)。
让我们看看文件的内容(https://githu b.com/vfarcic/go-demo/blob/master/ docker-compose-test-local.yml)。
我们把用于单元测试的服务称为unit,如下所示:
这是一个相对简单的定义,由于服务是使用Go编写的,因此我们使用的是golang:1.6镜像。
接下来,我们公开了几个卷。在这种情况下,卷是挂载在主机上的目录,它们由两个参数定义。第一个参数是主机目录的路径,第二个参数表示容器内的目录。主机目录内的任何文件都将在容器中可用,反之亦然。
第一个卷用于源文件。我们正把当前的主机目录共享到容器的/usr/src/myapp目录。第二卷用于Go依赖库,由于我们希望避免每次运行单元测试时都下载所有依赖项,因此它们将存储在主机目录/tmp/go中。这样,只有在第一次运行服务时才会下载依赖项。
卷之后是working_dir指令。当容器运行时,将使用指定的值作为起始目录。
最后,指定想要在容器中运行的命令。笔者不会详细介绍它们,因为它们是专门针对Go的。简言之,我们下载所有依赖项go get-d-v-t,运行单元测试go test--cover-v ./ ...,然后构建go-demo二进制文件go build-v-o go-demo。由于加载了有源代码的目录作为卷,因此二进制文件将存储在主机上,供以后使用。
通过这个单独的Compose服务,我们定义了CI流程的两个步骤。它包含单元测试和构建二进制文件。(www.xing528.com)
请注意,尽管我们运行称为unit的服务,但此CI步骤的真正目的是运行不需要部署任何类型的测试。这些是我们在构建二进制文件以及稍后的Docker镜像之前的测试。
让我们运行下面的代码:
给Windows用户的说明
你可能会遇到卷未正确映射的问题。如果你看到Invalid volume specification错误,请将环境变量COMPOSE_CONVERT_WINDOWS_PATHS设置为0:
如果这样解决了卷的问题,那么请确保每次运行docker-compose时都要设置该变量。
我们指定Compose使用docker-compose-test-local.yml文件(默认为docker-compose.yml)并运行名为unit的服务。--rm参数表示容器应该在停止后被移除。run命令应该用于不会永久运行的服务。它非常适合批处理作业,在这种情况下也适合运行测试。
从输出中可以看到,我们拉取了golang映像、下载了服务依赖项、成功运行了测试并构建了二进制文件。
使用下面的命令列出当前目录中的文件,可以确认该二进制文件确实已在主机上构建并可用。为简单起见,我们将过滤结果:
现在通过了第一轮测试并得到了二进制文件,下面继续构建Docker镜像。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。