我正在使用gtilab和docker建立一个持续集成系统。由于某种原因,我必须在CI系统的一个阶段中将当前容器作为新的docker映像提交,因此我可以在后续阶段中重用该映像。
总而言之,我必须执行以下命令:
docker commit $CONTAINER_ID $NEW_IMAGE_NAME
但是从容器内部。然后从另一个容器中:
docker rmi $NEW_IMAGE_NAME
一种解决方案可能是设置ssh公钥身份验证,并且:
ssh [email protected] docker ...
其中172.17.0.1是主机IP地址。为了安全起见,我可以限制ssh用户仅访问特定命令。
另一种解决方案是在主机的网络套接字上创建公共服务。但是,这里最好的方法是什么?我更喜欢一种安全的解决方案,因此从容器内部您只能提交docker映像并删除创建的映像(不能删除其他映像)。因此,狂野的SSH并不是那么安全。而且,我更喜欢一种不依赖主机IP地址的可移植解决方案。你有什么建议?
如何从容器中执行一些Docker API调用?
您是否知道可以通过添加选项在网络套接字上提供Docker API -H tcp://0.0.0.0:2375
?因此,您可以从容器内部直接执行对Docker守护程序的调用。
请注意,您也可以(并且应该)为此套接字cf启用TLS man docker daemon
。
如果此选项看起来不够干净或不够安全,则将需要本地联网*服务。我建议在其中使用Web APIjava
或python
该API来响应两个不同的调用,它们可能是:
http[s]://localhost:service-port/commit?containder_id=123456789&image_name=my_name
http[s]://localhost:service-port/rmi?containder_id=123456789
我在您的评论中看不懂您指的是哪个用户。
然后HTTP 201 Created
,HTTP 406 Not Acceptable
如果创建了映像或名称已经存在,则本地服务将回答a 。它还可以检查rmi
原始数据中是否执行了不超过一个。HTTP 204 Not Content
如果不存在具有该IDHTTP 403 Forbidden
的图像,该图像无法删除或HTTP 200 OK
一切正常,它可能会回答。在万不得已的情况下,它可以回答HTTP 418 I'm a teapot
。
*:本地网络是一种快速的,主要是安全的,易于部署的方法,可与Docker一起使用。man mkfifo
也可以使用FIFO(请参阅参考资料),但需要另一个共享卷(用于FIFO文件),并且可能需要更多代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句