我在亚马逊网络服务中运行自己的Drone实例,我希望它能构建一个docker镜像并将其推送到我的存储库中。Drone在docker容器中运行它的构建环境,所以我基本上想从docker容器内部构建docker镜像。我找到了this,看到你可以绑定安装码头插座。我如何使用无人机做到这一点?
docker run -it -v /var/run/docker.sock:/var/run/docker.sock mycompany/buildimage这样我就可以从我的容器内部运行docker build。或者你知道另一个CI工具,我可以运行我的自定义脚本并构建docker镜像。
发布于 2014-07-25 09:40:47
答案已过期,请查看下面@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_HOST环境。
$ export DOCKER_HOST="unix:///var/run/docker.sock"
$ docker build .不熟悉无人机安装,但这是docker提供的方式
发布于 2016-08-21 08:49:21
请注意,此答案适用于drone版本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您需要向drone提供Docker注册表的凭据,才能发布drone。这些凭据可以直接在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 Voume(备用方法)
您还询问是否可以将Docker套接字挂载到您的构建环境中。这是可能的,但需要一些额外的权限(在UI中将您的构建标记为受信任)
pipeline:
build:
image: docker
commands:
- docker build ...
- docker run ...
volumes:
- /var/run/docker.sock:/var/run/docker.sock这种方法的唯一问题是,如果构建失败,您可能无法清理在构建过程中创建的映像或容器。
此外,如果您的存储库是公共的并接受拉取请求,则不应使用此方法。恶意拉入请求可能会利用主机Docker套接字向您的构建环境进行攻击,从而允许访问主机。
发布于 2014-09-04 02:34:55
我写了 ,我还解决了一些常见的问题。
请记住,Drone的构建环境本身就是Docker容器,这意味着您将处于Docker-in-Docker的情况下: Docker不能在Docker容器中正确运行。公认的解决方案是使用wrapdocker脚本启动内部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守护进程。
https://stackoverflow.com/questions/24946414
复制相似问题