用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/bar
replace为您要发布到的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实例。 我最后的设置看起来像:
对于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守护进程。