请注意,此答案适用于无人机版本 0.5
您可以使用Docker 插件来构建和发布 Docker 映像,作为构建管道中的一个步骤。在下面的示例.drone.yml
文件中,我添加了一个使用 docker 插件的发布步骤。请注意,您需要替换foo/bar
为您打算发布到的 DockerHub 存储库的名称。
pipeline:
build:
image: golang
commands:
- go build
- go test
publish:
image: plugins/docker
repo: foo/bar
在许多情况下,您会希望将此步骤的执行限制到某些分支。这可以通过添加运行时条件来完成:
publish:
image: plugins/docker
repo: foo/bar
when:
branch: master
您需要向无人机提供 Docker 注册表的凭据,以便无人机发布。这些凭据可以直接在 yaml 文件中声明,但通常不建议将这些值以纯文本形式存储在 yaml 中:
publish:
image: plugins/docker
repo: foo/bar
username: johnsmith
password: pa55word
when:
branch: master
您也可以使用内置的秘密存储提供您的凭据。可以使用 Drone 命令行实用程序在每个存储库的基础上将机密添加到机密存储:
export DRONE_SERVER=http://drone.server.address.com
export DRONE_TOKEN=...
drone secret add --image plugins/docker \
octocat/hello-world DOCKER_USERNAME johnsmith
drone secret add --image plugins/docker \
octocat/hello-world DOCKER_PASSWORD pa55word
在上面的示例中,该--image
标志用于限制我们将 Docker 凭据公开给哪些秘密,我们将其设置为 docker 插件。该octocat/hello-world
参数代表您的 GitHub 存储库名称,应替换为正确的值。
Mouting Voumes(替代方法)
您还询问是否可以将 Docker 套接字安装到您的构建环境中。这是可能的,但需要一些额外的权限(在 UI 中将您的构建标记为受信任)
pipeline:
build:
image: docker
commands:
- docker build ...
- docker run ...
volumes:
- /var/run/docker.sock:/var/run/docker.sock
这种方法的唯一问题是,如果您的构建失败,您可能无法清理在构建期间创建的映像或容器。
此外,如果您的存储库是公开的并接受拉取请求,则不应使用此方法。将您的主机 Docker 套接字暴露给您的构建环境可能会被恶意拉取请求利用,从而允许访问您的主机。