用Drone.io构buildDocker镜像

我正在AWS中运行我自己的Drone实例,我希望它build立一个docker镜像并将其推送到我的仓库。 无人驾驶飞机在docker集装箱中运行其构build环境,所以我基本上想要从docker集装箱内部构builddocker图像。 我发现这一点 ,看到你可以绑定装载dockersockets。 我如何与Drone做到这一点?

docker run -it -v /var/run/docker.sock:/var/run/docker.sock mycompany/buildimage 

所以我可以在我的容器中运行docker build 。 或者你知道另一个CI工具,我可以运行我的自定义脚本,并build立docker图像。

答案已经过时,请在下面检查@Brad的解决scheme,仅以此为参考

在你的mycompany/buildimage

安装docker客户端

 curl https://get.docker.io/builds/Linux/x86_64/docker-latest -o /usr/local/bin/docker chmod +x /usr/local/bin/docker 

然后你可以运行docker build命令使用docker主机环境

 $ docker -H unix:///var/run/docker.sock build . 

为了方便透明,通常可以设置DOCKER_HOST环境。

 $ export DOCKER_HOST="unix:///var/run/docker.sock" $ docker build . 

与无人机安装不类似,但这是docker提供的方式

请注意,这个答案适用于无人机版本0.5

您可以使用Docker插件来构build和发布Docker镜像作为构buildpipe道中的一个步骤。 在下面的示例.drone.yml文件中,我添加了一个使用.drone.yml插件的发布步骤。 请注意,您需要将foo/barreplace为您要发布到的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 

您将需要为您的Dockerregistry提供无人机凭据,以便无人机发布。 这些凭据可以直接在yaml文件中声明,但是通常不build议在yaml中以纯文本forms存储这些值:

  publish: image: plugins/docker repo: foo/bar username: johnsmith password: pa55word when: branch: master 

您也可以使用内置的秘密存储提供您的凭据。 可以使用Drone命令行实用程序以秘密存储库的forms将秘密添加到每个存储库:

  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存储库名称,应该replace为正确的值。

Mouting Voumes(替代方法)

您还问是否可以将Docker套接字安装到您的构build环境中。 这是可能的,但将需要一些额外的权限(在您的UI中将您的构build标记为可信)

 pipeline: build: image: docker commands: - docker build ... - docker run ... volumes: - /var/run/docker.sock:/var/run/docker.sock 

这种方法唯一的问题是,如果你的构build失败,你可能无法清理在构build过程中创build的图像或容器。

另外,如果您的存储库是公共的并且接受请求,则不应该使用这种方法。 将您的主机Docker socket暴露给您的构build环境可能会被恶意的请求所利用,从而允许访问您的主机。

我写了一篇文章,介绍如何让Drone输出一个Docker容器 ,同时我也解决了一些常见的问题。

请记住,Drone的构build环境本身就是一个Docker容器,这意味着您将处于Docker-in-Docker状态:开箱即用,Docker不能在Docker容器内正确运行。 接受的解决scheme是使用wrapdocker脚本来启动内部的Docker实例。 我最后的设置看起来像:

无人机的Docker

对于Drone,你可以在编译环境的Dockerfile中添加如下内容:

 # install docker RUN apt-get install -y apparmor RUN curl -s https://get.docker.io/ubuntu/ | sudo sh ADD wrapdocker /usr/local/bin/wrapdocker RUN chmod +x /usr/local/bin/wrapdocker 

这假定wrapdocker脚本在本地可用。 或者,你可以直接从github抓取wrapdocker。 然后,给一个.drone.yml文件,如:

 image: http://my-docker-registry/my-docker-image:version script: - ./.drone/build.sh 

你的build.sh将如下所示:

 #!/bin/bash set -e cd /var/cache/drone/src/path/to/app # [pass tests here] wrapdocker & sleep 5 docker build -t docker-registry/image-name . docker push docker-registry/image-name 

这只是一个办法。 唯一的限制是wrapdocker用来在构build容器中启动Docker守护进程。