使用Drone.io构建Docker镜像

Ber*_*rez 8 docker drone.io

我在AWS中运行自己的Drone实例,我希望它能够构建一个docker镜像并将其推送到我的仓库.Drone在docker容器中运行它的构建环境,所以我基本上想要在docker容器内构建docker镜像.我找到了这个,看到你可以绑定Docker插座.我如何使用无人机做到这一点?

docker run -it -v /var/run/docker.sock:/var/run/docker.sock mycompany/buildimage
Run Code Online (Sandbox Code Playgroud)

所以我可以docker build在我的容器内运行.或者你知道另一个CI工具,我可以运行我的自定义脚本和构建docker镜像.

Bra*_*ski 15

请注意,此答案适用于无人机版本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
Run Code Online (Sandbox Code Playgroud)

在许多情况下,您需要将此步骤的执行限制为某些分支.这可以通过添加运行时条件来完成:

  publish:
    image: plugins/docker
    repo: foo/bar
    when:
      branch: master
Run Code Online (Sandbox Code Playgroud)

您需要向无人机提供凭证到您的Docker注册表,以便无人机发布.这些凭证可以直接在yaml文件中声明,但通常不建议在yaml中以纯文本格式存储这些值:

  publish:
    image: plugins/docker
    repo: foo/bar
    username: johnsmith
    password: pa55word
    when:
      branch: master
Run Code Online (Sandbox Code Playgroud)

您也可以使用内置的秘密商店提供凭据.可以使用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
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,该--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
Run Code Online (Sandbox Code Playgroud)

这种方法的唯一问题是如果您的构建失败,您可能无法清除构建期间创建的图像或容器.

此外,如果您的存储库是公共的并且接受拉取请求,则不应使用此方法.将您的主机Docker套接字暴露给您的构建环境可能被恶意拉取请求利用,从而允许访问您的主机.


pai*_*lee 7

我写了一篇文章,其中包含让Drone输出Docker容器的步骤,我还解决了一些常见问题.

请记住,Drone的构建环境本身就是Docker容器,这意味着您将处于Docker-in-Docker状态:开箱即用,Docker无法在Docker容器内正常运行.接受的解决方案是使用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
Run Code Online (Sandbox Code Playgroud)

这假设wrapdocker脚本在本地可用.或者,您可以直接从github获取wrapdocker.然后,给出一个.drone.yml文件,如:

image: http://my-docker-registry/my-docker-image:version  
script:  
  - ./.drone/build.sh
Run Code Online (Sandbox Code Playgroud)

你的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
Run Code Online (Sandbox Code Playgroud)

这只是一种方法.唯一的限制是wrapdocker用于在构建容器中启动Docker守护程序.


Lar*_*Cai 1

答案已过时,请检查下面@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 
Run Code Online (Sandbox Code Playgroud)

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

$ docker -H unix:///var/run/docker.sock build .
Run Code Online (Sandbox Code Playgroud)

为了使其简单和透明,通常DOCKER_HOST可以设置环境。

$ export DOCKER_HOST="unix:///var/run/docker.sock"
$ docker build .
Run Code Online (Sandbox Code Playgroud)

对无人机安装不太熟悉,不过docker提供的是这样的方式