使用API​​部署/更新Marathon Docker映像

时间:2019-01-14 18:01:53

标签: python rest docker marathon

我正在编写代码以自动更新马拉松上已部署的图像。我使用马拉松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参考吗?

2 个答案:

答案 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