如何在DC OS中强制拉取docker镜像?

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

现在,我们放弃了chronos,尝试通过DCOs设置它,使用mesos和metronome。

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

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

现在,在DC / OS中使用metronome和mesos,我也希望它强制它总是从注册表拉取最新的映像,而不是依赖于其缓存的版本。

但是docker的json配置似乎有限:

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

如果我将新映像推送到“production”标记,则mesos上的作业运行仍使用旧映像。

就是为了这个,我尝试添加了标志:

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

然而,在提交请求时,我收到一个错误:

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始终拉取最新的映像?还是我必须通过唯一的图像标记始终更新作业定义?

点赞
用户2623798
用户2623798

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

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

看看“强制拉取选项”。

2017-05-11 23:50:32
用户457268
用户457268

由于目前尚不支持此操作,因此我创建了一个功能请求来要求此功能。


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

基本上,我从metronome api中获取所有作业,按启动我的应用程序名称开头过滤它们,然后更改docker图像,并为每个更改的作业发出一个PUT请求以更新配置。

下面是我的解决方案:

const targetTag = 'stage-build-1501'; // 目前硬编码,应该通过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.'); // 我不想更改所有作业的图像,只想更改同一应用程序的作业
    });

    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-12 16:24:47
用户1603357
用户1603357
2017-06-21 20:38:14
用户6158194
用户6158194

我曾经遇到过类似的问题,我的图片仓库是经过身份验证的,我无法使用 metronome 语法提供必要的身份验证信息。我的解决方法是指定两个命令,而不是直接引用图片。

docker --config /etc/.docker pull
docker --config /etc/.docker run
2017-09-11 22:03:31