使用Drone.io构建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。或者您知道我可以运行自定义脚

我正在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映像的另一个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