我正在编写代码以自动更新马拉松上已部署的图像。我使用马拉松API参考http://mesosphere.github.io/marathon/api-console/index.html
中列出的REST补丁方法 url = 'https://<my-hostname>:<my-port>/v2/apps'
h = {'Content-type': 'application/json', 'Accept': 'application/json'}
data = {'app': { "id": app,
'container': {
'docker': {
'image': image}}}}
print ('requests.patch(%s, %s)' % (url + app, json.dumps(data)))
r = requests.patch(url + app, headers = h, auth = auth, data = json.dumps(data))
if r.status_code == 200:
print('Deployed %s' % app)
代码成功运行,我获得了一个部署ID,但UI并未进行任何更改。没有新的部署发生。如果我将补丁请求更改为不带数据的获取请求,则会使用上面的代码获取先前更新的图像。
根据此相似的API参考https://docs.mesosphere.com/1.11/deploying-services/marathon-api/#/apps/V2AppsByAppId1
它显示“此操作将创建部署”,但是什么也没有发生。从Marathon GUI中,我看不到配置发生任何更改。如果重新启动,则与重新启动的旧部署相同。我会错误地解释API参考吗?
答案 0 :(得分:1)
如果我正确阅读了API参考指南,则正文应为:
{ "id": app,
"container": {
"docker": {
"image": image
}
}
}
使用马拉松1.4.11对此进行了测试,并且效果良好。 不知道为什么会得到一个Deploymentid,如果按照我的方式进行(使用额外的{“ app”:}层),则会收到500错误。顺便说一句,我不确定这对单引号和双引号有多敏感。
答案 1 :(得分:0)
马拉松中有open bug,这导致请求正文未与当前定义合并。因此,仅使用.container.docker.image
的 PUT / PATCH 请求将删除诸如端口映射,音量, 参数 ...
解决方案是从当前应用程序中获取container
对象,并将image
键替换为新的Docker映像。
示例:
export MARATHON_IMAGE="registry.foo.bar/app:v10"
export BODY=$(curl -s -H "Content-type: application/json" leader.mesos:8080/v2/apps/foo/bar | jq -cr '.app.container | .docker.image = env.MARATHON_IMAGE | {"container": .}')
curl -s -H "Content-type: application/json" -X PATCH -d "${BODY}" leader.mesos:8080/v2/apps/foo/bar