我正试图在CI上运行一个在幕后使用docker的脚本(unitest(。该脚本在droneci上按预期工作,但切换到CloudBuild时,尚不清楚如何设置DinD。
对于droneci,我基本上使用这里显示的DinD,我的问题是,如何将代码翻译到GoogleCloudBuild。这可能吗?
我在互联网上搜索CloudBuild wrt DinD的语法,但找不到什么。
Cloud Build允许您从源代码创建Docker容器映像。Cloud SDK提供了container build
子命令,以便轻松使用此服务。
例如,这里有一个构建Docker镜像的简单命令:gcloud builds submit -t gcr.io/my-project/my-image
该命令将当前目录中的文件发送到Google Cloud Storage,然后在其中一个Cloud Build VM上,获取源代码,运行Docker Build,并将图像上传到Container Registry默认情况下,Cloud Build运行docker Build命令来构建图像。您还可以通过自定义生成步骤来自定义生成管道。如果您可以使用任意Docker映像作为构建步骤,并且源代码可用,那么您可以将单元测试作为构建步骤运行。通过这样做,您总是使用相同的Docker映像运行测试。cloudbuild测试运行程序示例中有一个演示存储库。本教程使用演示存储库作为其说明的一部分
我还建议您查看这些具有类似用例的信息链接:
- 在Google云构建上运行集成测试
- 谷歌云构建管道
我设法找到了一种在CloudBuild中的Docker(DinD(中运行Docker的方法。要做到这一点,我们需要在后台使用dockercompose启动一项服务。您的docker-compose.yml
脚本应该是这样的。
version: '3'
services:
dind-service:
image: docker:<dnd-version>-dind
privileged: true
ports:
- "127.0.0.1:2375:2375"
- "127.0.0.1:2376:2376"
networks:
default:
external:
name: cloudbuild
在我的情况下,我使用18.03或18.09版本没有问题,以后的版本也应该可以。其次,将容器连接到cloudbuild网络非常重要。这样,dind容器将与步骤中生成的每个容器位于同一网络上。
要启动服务,您需要在cloudbuild.yml
文件中添加一个步骤。
- id: start-dind
name: docker/compose
args: ['-f', 'docker-compose.yml', 'up', '-d', 'dind-service']
要验证dind服务是否按预期工作,只需创建一个ping步骤即可。
- id: 'Check service is listening'
name: gcr.io/cloud-builders/curl
args: ["dind-service:2375"]
waitFor: [start-dind]
现在,如果它有效,你可以在后台使用dind正常运行脚本。重要的是传递DOCKER_HOST
env变量,以便docker客户端能够定位docker引擎。
- id: my-script
name: my-image
script: myscript
env:
- 'DOCKER_HOST=tcp://dind-service:2375'
请注意,由脚本派生的任何容器都将位于dind服务中,因此,如果要对其进行任何请求,则不应该对http://localhost
进行请求,而应该向http://dind-service
进行请求。此外,如果要使用私人映像,则在运行脚本之前需要进行某种类型的身份验证。为此,您应该在运行脚本之前先运行gcloud auth configure-docker --quiet
。确保你的docker镜像已经安装了gcloud。这将创建运行应用程序所需的身份验证凭据。凭据保存在与$HOME
变量相关的路径中,因此请确保您的应用程序能够访问它。例如,如果使用tox,您可能会遇到一些问题。