使用Drone.io构建Docker图像
我正在AWS中运行我自己的实例,我希望它构建一个docker映像并将其推送到我的repo。Drone在docker容器中运行其构建环境,所以我基本上希望从docker容器中构建docker图像。我发现并看到您可以绑定安装docker插座。我该如何使用无人机使用Drone.io构建Docker图像,docker,drone.io,Docker,Drone.io,我正在AWS中运行我自己的实例,我希望它构建一个docker映像并将其推送到我的repo。Drone在docker容器中运行其构建环境,所以我基本上希望从docker容器中构建docker图像。我发现并看到您可以绑定安装docker插座。我该如何使用无人机 docker run -it -v /var/run/docker.sock:/var/run/docker.sock mycompany/buildimage 因此,我可以在容器中运行docker build。或者您知道我可以运行自定义脚
docker run -it -v /var/run/docker.sock:/var/run/docker.sock mycompany/buildimage
因此,我可以在容器中运行
docker build
。或者您知道我可以运行自定义脚本并生成docker映像的另一个CI工具吗。答案已过时,请检查下面的@Brad解决方案,仅用作参考
在您的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主机环境运行docker build
命令
$ docker -H unix:///var/run/docker.sock build .
为了使其简单透明,通常可以设置DOCKER\u主机
环境
$ export DOCKER_HOST="unix:///var/run/docker.sock"
$ docker build .
我不熟悉无人机的安装,但这是docker提供的方式,我写过,我也解决了一些常见问题。
请记住,无人机的构建环境本身就是一个Docker容器,这意味着您将处于一种情况:开箱即用,Docker无法在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在构建容器中启动Docker守护进程。注意,此答案适用于无人机版本0.5 可以使用生成和发布Docker映像,作为生成管道中的一个步骤。在下面的示例
.drone.yml
文件中,我添加了一个使用docker插件的发布步骤。请注意,您需要将foo/bar
替换为要发布到的DockerHub存储库的名称
管道:
建造:
图片:戈朗
命令:
-建造
-去测试
出版:
图片:插件/docker
回购: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命令行实用程序将机密添加到每个存储库的机密存储中:
导出无人机\u服务器=http://drone.server.address.com
导出无人机\u令牌=。。。
无人机秘密添加——图像插件/docker\
octocat/hello world DOCKER\u用户名johnsmith
无人机秘密添加——图像插件/docker\
octocat/hello world DOCKER\u密码pa55word
在上面的示例中,--image
标志用于限制我们向哪些机密公开Docker凭据,并将其设置为Docker插件。octocat/hello world
参数表示您的GitHub存储库名称,应替换为正确的值
移动翼(备用进近)
您还询问是否可以将Docker套接字装载到构建环境中。这是可能的,但需要一些额外的权限(在UI中将您的构建标记为受信任)
这种方法的唯一问题是,如果生成失败,您可能无法清理生成期间创建的图像或容器
此外,如果您的存储库是公共的并且接受拉取请求,则不应该使用这种方法。恶意拉取请求可能会利用将主机Docker套接字暴露到生成环境中的漏洞,从而允许访问主机。现在就试用。看起来“docker build”可以运行docker run mycompany/buildimage docker build。但是docker运行的mycompany/buildimage docker images无法工作。。嗯……你能更清楚地描述一下什么是有效的,什么是无效的吗?我最终扔掉了无人机,建立了自己的CI工具。它监听githooks并拉取回购协议,并使用无人机构建图像。我正在按照你的建议去做,就是自己安装Docker,而不是尝试使用Drone的版本。我用这个厨师食谱来安装Docker。谢谢你的帮助!嘿@LarryCai,我试过你的例子,它不允许读取'proc/sys/net/ipv4/route/flush',即使在
--特权
模式下运行。这个例子不起作用的原因是drone在docker容器中运行你的构建。因此,这将在Docker中运行Docker,这是可能的,但需要提升权限,并且可能无法在某些Linux内核或发行版上运行(例如,带有DeviceMapper的RedHat)。有一个本地的无人机解决方案,用于构建和发布图像,使用docker插件。哦,我找到了dind,但它仍然有点脆弱。也许b/c我的剧本里没有“睡眠5”。。。但我已经离开了。此外,还需要将项目设置为具有--privileged标志。所以我想在无人机的容器中做Docker ey的事情,但我不想在Docker(dind)中完全Docker,并在--特权模式下运行。。。《Docker》中的never To full Docker:)这是一篇很好的文章,非常清楚,只是不是我最后的方式。我会投赞成票,看看人们是否喜欢。谢谢@伯尼佩雷斯:当然。为什么在Docker中从来没有完整的Docker?如何从AWS ECR中提取管道步骤的图像?我正在成功地使用ECR插件构建和推送图像,但我会
pipeline:
build:
image: docker
commands:
- docker build ...
- docker run ...
volumes:
- /var/run/docker.sock:/var/run/docker.sock