1

对于 docker 编排,我们目前正在使用 mesos 和 chronos 来安排作业运行。

现在,我们放弃了 chronos 并尝试通过 DCO 设置它,使用 mesos 和节拍器。

在 chronos 中,我可以通过 yml 配置激活强制拉取 docker 映像:

container:
  type: docker
  image: registry.example.com:5001/the-app:production
  forcePullImage: true

现在,在使用节拍器和 mesos 的 DC/OS 中,我还希望它强制它始终从注册表中提取最新图像,而不是依赖其缓存版本。

然而 docker 的 json 配置似乎有限:

"docker": {
  "image": "registry.example.com:5001/the-app:production"
},

如果我将新图像推送到production标签,旧图像将用于在 mesos 上运行的作业。

只是为了它,我尝试添加标志:

"docker": {
  "image": "registry.example.com:5001/my-app:staging",
  "forcePullImage": true
},

但是在 put 请求中,我收到一个错误:

http PUT example.com/service/metronome/v1/jobs/the-app < app-config.json 

HTTP/1.1 422 Unprocessable Entity
Connection: keep-alive
Content-Length: 147
Content-Type: application/json
Date: Fri, 12 May 2017 09:57:55 GMT
Server: openresty/1.9.15.1

{
    "details": [
        {
            "errors": [
                "Additional properties are not allowed but found 'forcePullImage'."
            ],
            "path": "/run/docker"
        }
    ],
    "message": "Object is not valid"
}

如何实现 DC OS 始终获取最新映像?还是我必须始终通过唯一的图像标签更新作业定义?

4

4 回答 4

4

Metronome API 尚不支持此功能,请参阅https://github.com/dcos/metronome/blob/master/api/src/main/resources/public/api/v1/schema/jobspec.schema.json

于 2017-06-21T20:38:14.830 回答
0

我有一个类似的问题,我的图像存储库经过身份验证,我无法使用节拍器语法提供必要的身份验证信息。我通过指定 2 个命令而不是直接引用图像来解决这个问题。

docker --config /etc/.docker pull
docker --config /etc/.docker run
于 2017-09-11T22:03:31.420 回答
0

由于目前这是不可能的,我创建了一个功能请求,要求提供此功能。


同时,我创建了解决方法,以便能够使用 typescript 和 request-promise 库更新所有已注册作业的图像标签。

基本上,我从节拍器 api获取所有作业,通过以我的应用名称开头的 id 过滤它们,然后更改 docker 映像,并为每个更改的作业向节拍器 api 发出 PUT 请求以更新配置。

这是我的解决方案:

const targetTag = 'stage-build-1501'; // currently hardcoded, should be set via jenkins run
const app = 'my-app';
const dockerImage = `registry.example.com:5001/${app}:${targetTag}`;

interface JobConfig {
    id: string;
    description: string;
    labels: object;
    run: {
        cpus: number,
        mem: number,
        disk: number,
        cmd: string,
        env: any,
        placement: any,
        artifacts: any[];
        maxLaunchDelay: 3600;
        docker: { image: string };
        volumes: any[];
        restart: any;
    };
}

const rp = require('request-promise');

const BASE_URL = 'http://example.com';
const METRONOME_URL = '/service/metronome/v1/jobs';
const JOBS_URL = BASE_URL + METRONOME_URL;

const jobsOptions = {
    uri: JOBS_URL,
    headers: {
        'User-Agent': 'Request-Promise',
    },
    json: true,
};

const createJobUpdateOptions = (jobConfig: JobConfig) => {
    return {
        method: 'PUT',
        body: jobConfig,
        uri: `${JOBS_URL}/${jobConfig.id}`,
        headers: {
            'User-Agent': 'Request-Promise',
        },
        json: true,
    };
};

rp(jobsOptions).then((jobs: JobConfig[]) => {
    const filteredJobs = jobs.filter((job: any) => {
        return job.id.includes('job-prefix.'); // I don't want to change the image of all jobs, only for the same application
    });

    filteredJobs.map((job: JobConfig) => {
        job.run.docker.image = dockerImage;
    });

    filteredJobs.map((updateJob: JobConfig) => {
        console.log(`${updateJob.id} to be updated!`);
        const requestOption = createJobUpdateOptions(updateJob);
        rp(requestOption).then((response: any) => {
            console.log(`Updated schedule for ${updateJob.id}`);
        });
    });

});
于 2017-05-12T16:24:47.847 回答
-2

我认为"forcePullImage": true应该与docker字典一起使用。

检查: https ://mesosphere.github.io/marathon/docs/native-docker.html

查看“强制拉动选项”。

于 2017-05-11T23:50:32.510 回答