10

I'm running my own Drone instance in AWS and I want it to build a docker image and push it to my repo. Drone runs its build environment in a docker container, so I basically want to build docker images from inside a docker container. I found this and saw you can Bind Mount the docker socket. How do I do this with Drone?

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

So I can run docker build from inside my container. Or do you know of another CI tool that I can run my custom script and build docker images.

4

3 回答 3

22

请注意,此答案适用于无人机版本 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

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

  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 命令行实用程序在每个存储库的基础上将机密添加到机密存储:

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

Mouting Voumes(替代方法)

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

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

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

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

于 2016-08-21T00:49:21.393 回答
6

我写了一篇文章,介绍了让 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

这假设 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 守护进程。

于 2014-09-03T18:34:55.467 回答
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 

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

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

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

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

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

于 2014-07-25T01:40:47.473 回答