我正在使用gtilab和docker建立一个持续集成系统。出于某种原因,我必须在CI系统的一个阶段中将当前容器作为新的docker镜像提交,因此我可以在后续阶段重用该图像。
总结一下,我必须执行这个命令:
docker commit $CONTAINER_ID $NEW_IMAGE_NAME
但是从容器里面。后来又来自另一个容器:
docker rmi $NEW_IMAGE_NAME
一种解决方案可能是设置ssh公钥认证,并且:
ssh user@172.17.0.1 docker ...
其中,172.17.0.1是主机IP地址。我可以限制ssh用户只访问特定的安全命令。
另一种解决方案是在主机中的网络套接字上创建公共服务。但这里最好的方法是什么?我更喜欢安全的解决方案,因此从容器内部您只能提交泊坞窗图像并删除创建的图像(而不是其他图像)。所以,一个狂野的ssh并不那么安全。而且,我更喜欢更便携的解决方案,它不会在主机IP地址上进行中继。你有什么建议?
答案 0 :(得分:2)
如何从容器中执行一些Docker API调用?
您是否知道可以通过添加选项-H tcp://0.0.0.0:2375
在网络套接字上提供Docker API?因此,您可以从容器内直接执行对Docker守护程序的调用。
请注意,您可以(也应该)为此套接字启用TLS,参见man docker daemon
。
如果此选项看起来不够干净或不够安全,则需要本地网络*服务。我建议在java
或python
中使用一个可以响应两种不同呼叫的网络API:
http[s]://localhost:service-port/commit?containder_id=123456789&image_name=my_name
http[s]://localhost:service-port/rmi?containder_id=123456789
我在your comment您不了解您所指的用户。
如果图像已创建,本地服务将回答HTTP 201 Created
,如果名称已存在,则回复HTTP 406 Not Acceptable
。它还可以检查raw中是否执行了不超过一个rmi
。如果没有包含此ID的图片,则HTTP 204 Not Content
可以回答HTTP 403 Forbidden
,如果一切顺利,则HTTP 200 OK
无法删除图片或HTTP 418 I'm a teapot
。在最后的手段,它可以回答man mkfifo
。
*:本地网络是一种快速,大部分安全,易于部署并可与Docker本机配合使用。也可以使用FIFO,参见$dropbox = $this->get('acme.dropbox.api');
$dropbox->getAccountInfo();
,但需要另一个共享卷(对于FIFO文件),也许还需要更多代码。