【问题标题】:Building Docker Images with Drone.io使用 Drone.io 构建 Docker 镜像
【发布时间】:2014-09-16 18:11:59
【问题描述】:

我正在 AWS 中运行我自己的 Drone 实例,我希望它构建一个 docker 映像并将其推送到我的存储库。 Drone 在 docker 容器中运行其构建环境,所以我基本上想从 docker 容器中构建 docker 映像。我找到了this,看到你可以绑定安装 docker 套接字。我该如何使用 Drone?

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

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

【问题讨论】:

    标签: docker drone.io


    【解决方案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提供的方式是这样的

    【讨论】:

    • 今天试用一下。看起来“docker build”运行 docker run mycompany/buildimage docker build 。但是 docker run mycompany/buildimage docker images 不工作.. 嗯....
    • 你能更清楚地描述什么是有效的,什么是无效的吗?
    • 我最终放弃了 Drone 并构建了自己的 CI 工具。它监听 g​​ithooks 并拉取 repo 并使用 Drone 构建图像。我正在按照您的建议进行操作,即我自己安装 Docker,而不是尝试使用 Drone 的版本。我正在为我的 Docker 安装使用这个厨师食谱。 github.com/bflad/chef-docker感谢您的帮助!
    • 嘿@LarryCai,我试过你的例子,即使在--privileged模式下运行,它也会产生no permission to read from 'proc/sys/net/ipv4/route/flush'
    • 这个例子不起作用的原因是无人机在 docker 容器中运行你的构建。因此,这将在 Docker 中运行 Docker,这是可能的,但需要提升的权限,并且可能无法在某些 Linux 内核或发行版上运行(例如,带有 DeviceMapper 的 RedHat)。有一个使用 docker 插件构建和发布图像的原生无人机解决方案。
    【解决方案2】:

    我写了an article with steps to get Drone to output a Docker container,也解决了一些常见问题。

    请记住,Drone 的构建环境本身就是一个 Docker 容器,这意味着您将处于Docker-in-Docker 的情况:开箱即用,Docker 无法在 Docker 容器中正确运行。公认的解决方案是使用wrapdocker 脚本来启动内部 Docker 实例。我的最终设置如下:

    对于 Drone,您需要在 build 环境的 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 守护进程。

    【讨论】:

    • 哦,我找到了dind,但还是有点小问题。也许 b/c 我的剧本中没有“睡眠 5”……但我已经继续前进了。此外,您需要将项目设置为具有 --privileged 标志。所以我想在 Drone 的容器中做 Docker-ey 的事情,但我不想在 Docker (dind) 中使用完整的 Docker 并在 --privileged 模式下运行......永远不要在 Docker 中使用完整的 Docker :) 这是一篇好文章不过,很清楚,只是不是我最后走的路。我会赞成它,看看人们是否喜欢它。谢谢!
    • @BerniePerez 确定。为什么在 Docker 中从来没有完整的 Docker?
    【解决方案3】:

    请注意,此答案适用于无人机版本 0.5

    您可以使用Docker plugin 来构建和发布 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 套接字暴露给您的构建环境可能会被恶意拉取请求利用,从而允许访问您的主机。

    【讨论】:

    • 如何从 AWS ECR 中提取管道步骤的图像?我已成功使用 ECR 插件构建和推送映像,但我想使用发布到 ECR 的客户容器作为构建管道中的映像。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2020-10-06
    • 2021-11-25
    • 1970-01-01
    • 2017-06-19
    相关资源
    最近更新 更多